GNU/Linux >> Belajar Linux >  >> Linux

Deskriptor File &Skrip Shell?

Saya mengalami kesulitan memahami bagaimana seseorang menggunakan deskriptor file dalam skrip shell.

Saya tahu dasar-dasarnya seperti

exec 5 > /tmp/foo

Jadi fd 5 dilampirkan ke foo untuk menulis.

exec 6 < /tmp/bar

… untuk membaca.

exec 5>&-

… tutup fd.

Sekarang apa fungsinya?

#!/bin/bash

exec 5 > /tmp/foo 
exec 6 < /tmp/bar 

cat <&6 | while read a
do
     echo $a >&5
done

Seperti yang saya pahami &5 menutup fd, jadi bagaimana output masih berhasil diarahkan ulang setelah setiap panggilan?

Ini adalah salinan pasta dari :Sini

Ia mengklaim menggunakan ini melalui echo $a > file sederhana akan membuatnya lebih cepat, namun saya gagal untuk mengerti. Saya akan menghargai tautan apa pun ke tutorial yang layak. Saya kekuatan google tampaknya mengecewakan saya.

Jawaban yang Diterima:

Pertama, perhatikan bahwa sintaks untuk penutupan adalah 5>&- atau 6<&- , tergantung pada apakah deskriptor file sedang dibaca untuk ditulis atau untuk dibaca. Tampaknya ada kesalahan ketik atau pemformatan pada entri blog tersebut.

Ini skrip yang dikomentari.

exec 5>/tmp/foo       # open /tmp/foo for writing, on fd 5
exec 6</tmp/bar       # open /tmp/bar for reading, on fd 6
cat <&6 |             # call cat, with its standard input connected to
                      # what is currently fd 6, i.e., /tmp/bar
while read a; do      # 
  echo $a >&5         # write to fd 5, i.e., /tmp/foo
done                  # 

Tidak ada penutupan di sini. Karena semua input dan output menuju ke tempat yang sama dalam contoh sederhana ini, penggunaan deskriptor file tambahan tidak diperlukan. Anda bisa menulis

cat </tmp/bar |
while read a; do
  echo $a
done >/tmp/foo

Menggunakan deskriptor file eksplisit menjadi berguna saat Anda ingin menulis ke banyak file secara bergantian. Misalnya, pertimbangkan skrip yang mengeluarkan data ke file output data dan mencatat data ke file log dan mungkin juga pesan kesalahan. Itu berarti tiga saluran keluaran:satu untuk data, satu untuk log, dan satu untuk kesalahan. Karena hanya ada dua deskriptor standar untuk keluaran, yang ketiga diperlukan. Anda dapat memanggil exec untuk membuka file keluaran:

exec >data-file
exec 3>log-file
echo "first line of data"
echo "this is a log line" >&3
…
if something_bad_happens; then echo error message >&2; fi
exec >&-  # close the data output file
echo "output file closed" >&3

Pernyataan tentang efisiensi muncul ketika Anda memiliki pengalihan dalam satu lingkaran, seperti ini (asumsikan file tersebut kosong untuk memulai):

while …; do echo $a >>/tmp/bar; done

Pada setiap iterasi, program membuka /tmp/bar , mencari ke akhir file, menambahkan beberapa data dan menutup file. Lebih efisien untuk membuka file sekali dan untuk semua:

while …; do echo $a; done >/tmp/bar

Ketika ada beberapa pengalihan yang terjadi pada waktu yang berbeda, panggil exec untuk melakukan pengalihan daripada membungkus blok dalam pengalihan menjadi berguna.

exec >/tmp/bar
while …; do echo $a; done

Anda akan menemukan beberapa contoh pengalihan lainnya dengan menjelajahi io-redirection tag di situs ini.

Terkait:Menyesuaikan bash shell:Tebalkan/warnai perintahnya?
Linux
  1. Bagaimana Membuat File Sementara Di Shell Script?

  2. Mekanisme Blok Pernyataan Dalam Scripting Shell?

  3. Shell - Tulis konten variabel ke file

  1. Apa itu Exec 3?

  2. Apa itu penggunaan () dalam skrip shell?

  3. Bisakah file .sh menjadi malware?

  1. Haruskah Saya Menggunakan Apt Atau Apt-get Di Shell Scripting?

  2. Bagaimana Membandingkan String di Bash Shell Scripting

  3. Cegah pewarisan deskriptor file selama fork Linux