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.