GNU/Linux >> Belajar Linux >  >> Linux

Apa sebenarnya <() di bash (dan =() di zsh)?

Ini disebut substitusi proses.

<(list) sintaks didukung oleh keduanya, bash dan zsh . Ini menyediakan cara untuk melewatkan output dari perintah (list ) ke perintah lain saat menggunakan pipa (| ) itu tidak mungkin. Misalnya ketika sebuah perintah tidak mendukung input dari STDIN atau Anda memerlukan keluaran dari beberapa perintah:

diff <(ls dirA) <(ls dirB)

<(list) menghubungkan output dari list dengan file di /dev/fd , jika didukung oleh sistem, jika tidak, pipa bernama (FIFO) digunakan (yang juga bergantung pada dukungan sistem; tidak ada manual yang mengatakan apa yang terjadi jika kedua mekanisme tidak didukung, mungkin dibatalkan dengan kesalahan). Nama file kemudian diteruskan sebagai argumen pada baris perintah.

zsh tambahan mendukung =(list) sebagai pengganti <(list) . Dengan =(list) file sementara digunakan sebagai pengganti file di /dev/fd atau FIFO. Ini dapat digunakan sebagai pengganti <(list) jika program perlu lseek di output.

Menurut manual ZSH, mungkin juga ada masalah lain dengan cara <(list) bekerja:

= form berguna baik sebagai /dev/fd dan implementasi pipa bernama <(...) memiliki kekurangan. Dalam kasus sebelumnya, beberapa program dapat secara otomatis menutup deskriptor file yang dimaksud sebelum memeriksa file pada baris perintah, terutama jika hal ini diperlukan untuk alasan keamanan seperti saat program menjalankan setuid. Dalam kasus kedua, jika program tidak benar-benar membuka file, subkulit yang mencoba membaca dari atau menulis ke pipa akan (dalam implementasi tipikal, sistem operasi yang berbeda mungkin memiliki perilaku yang berbeda) memblokir selamanya dan harus dibunuh secara eksplisit . Dalam kedua kasus, shell benar-benar menyuplai informasi menggunakan pipa, sehingga program yang diharapkan untuk lseek (lihat halaman manual lseek(2) ) pada file tidak akan berfungsi.


Perhatikan, ini adalah jawaban bash, bukan zsh.

Ada beberapa kasus di bash di mana Anda tidak dapat menggunakan pipa:

some_command | some_other_command

karena pipa memperkenalkan subkulit untuk setiap komponen pipa, saat subkulit keluar, efek samping apa pun yang Anda andalkan akan hilang. Misalnya, contoh yang dibuat-buat ini:

cat file | while read line; do ((count++)); done
echo $count

akan menampilkan baris kosong, karena $count variabel tidak ada di shell saat ini.

Substitusi proses bash memungkinkan Anda menghindari teka-teki ini dengan memungkinkan Anda membaca dari output "some_command" seperti yang Anda lakukan dari file

while read line; do ((count++)); done < <(cat file)
# ....................................1.2
echo $count   # the variable *does* exist in the current shell

(1) adalah pengalihan input normal. (2) adalah awal dari <() sintaks substitusi proses.


Linux
  1. Apa itu NFS dan bagaimana cara menginstalnya di Linux

  2. Apa yang Terjadi Saat Saya Mengeksekusi File Di Shell?

  3. Fitur Apa Yang Ada Di Zsh Dan Hilang Dari Bash, Atau Sebaliknya?

  1. Basa'?

  2. Apa Arti -s Dan [[]] Dalam Kondisi If Di Bash?

  3. Apa itu SUID, SGID dan Sticky bit?

  1. Bagaimana cara mendaftar ukuran setiap file dan direktori dan mengurutkan berdasarkan ukuran menurun di Bash?

  2. Apa itu file .pid dan apa isinya?

  3. Apa itu `S_ISREG()`, dan apa fungsinya?