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 manuallseek(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.