Beberapa shell, seperti bash
, mendukung Substitusi Proses yang merupakan cara untuk menampilkan output proses sebagai file, seperti ini:
$ diff <(sort file1) <(sort file2)
Namun, konstruksi ini bukan POSIX dan, karenanya, tidak portabel. Bagaimana bisa memproses penggantian dicapai dalam POSIX cara-ramah (yaitu satu yang bekerja di /bin/sh
) ?
catatan: pertanyaannya bukan menanyakan bagaimana membedakan dua file yang diurutkan - itu hanya contoh yang dibuat untuk menunjukkan substitusi proses !
shell
pipe
posix
process-substitution
starfry
sumber
sumber
/bin/sh
menjadi shell POSIX, hanya saja ada perintah yang disebut dish
suatu tempat yang di lingkungan yang benar adalah POSIX compliant. Misalnya, pada Solaris 10,/bin/sh
bukan shell POSIX, itu adalah shell Bourne kuno dan shell POSIX ada di/usr/xpg4/bin/sh
.Jawaban:
Fitur itu diperkenalkan oleh
ksh
(pertama kali didokumentasikan dalam ksh86) dan memanfaatkan/dev/fd/n
fitur tersebut (ditambahkan secara independen di beberapa BSD dan sistem AT&T sebelumnya). Diksh
dan hingga ksh93u, itu tidak akan berfungsi kecuali sistem Anda memiliki dukungan untuk / dev / fd / n. zsh, bash danksh93u+
dan di atas dapat menggunakan pipa bernama sementara (pipa bernama ditambahkan di SysIII saya percaya) di mana / dev / fd / n tidak tersedia.Pada sistem di mana tersedia (POSIX tidak menentukan itu), Anda dapat melakukan sendiri proses substitusi ( ) dengan:
/dev/fd/n
diff <(cmd1) <(cmd2)
Namun itu tidak bekerja dengan
ksh93
di Linux seperti di sana, pipa shell diimplementasikan dengan socketpairs bukan pipa dan membuka di/dev/fd/3
mana fd 3 menunjuk ke soket tidak bekerja di Linux.Meskipun POSIX tidak menentukan . Itu menentukan pipa bernama. Pipa bernama bekerja seperti pipa normal kecuali Anda dapat mengaksesnya dari sistem file. Masalahnya di sini adalah bahwa Anda harus membuat yang sementara dan membersihkan yang sulit dilakukan dengan andal terutama mengingat bahwa POSIX tidak memiliki mekanisme standar (seperti yang ditemukan pada beberapa sistem) untuk membuat file atau direktori sementara, dan melakukan penanganan sinyal dengan mudah. (untuk membersihkan pada saat hang-up atau membunuh) juga sulit dilakukan dengan mudah.
/dev/fd/n
mktemp -d
Anda dapat melakukan sesuatu seperti:
(tidak mengurus penanganan sinyal di sini).
sumber
/dev/fd/n
contoh Anda . Mengapa deskriptor 4 ditutup dua kali? (Dan juga deskriptor 3.) Saya tersesat.cmd2
(dup2(0,4)
di luar{...}
, dikembalikan dengandup2(4,0)
untuk di dalam{...}
).mktemp -d
untuk membantu memastikan Anda mendapatkan FIFO, karena tidak seorang pun harus menulis ke direktori sementara acak baru Anda.mktemp -d
. Tapi itu bukan perintah standar / POSIX.Jika perlu untuk menghindari variabel yang hilang dalam berguna
cmd | while read A B C
, alih-alih:Anda dapat gunakan:
Jadi untuk menjawab pertanyaan:
sumber