Dari pos commandlinefu ini :
$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)
Sepertinya beberapa input standar tetapi --- jika saya ingat kursus Linux Porgramming saya dengan benar --- ini tidak mungkin. Saya pikir, menurut definisi, input standar adalah satu aliran.
Mungkin ini ada hubungannya dengan stdin? Dapatkah seseorang menjelaskan hal ini kepada saya; mungkin memberikan tautan ke dokumentasi.
Bonus: Bagaimana skrip menangani banyak aliran ini? Jika seseorang dapat memberikan contoh Python atau Perl, itu akan sangat membantu.
<(…)
; dalam sintaks substitusi proses Zsh adalah=(…)
.Jawaban:
Ini bukan beberapa input standar. Ini adalah bash'ism yang disebut 'Substitusi Proses' http://tldp.org/LDP/abs/html/process-sub.html
Ini membuat file pseudo (
/dev/fd/something
) untuk setiap substitusi. Ini sangat berguna. Perintah hanya bisa dibaca sebagai stream, artinya tidak bisa bolak-balik dengan fseek. Perlu membacanya sebagai aliran byte, seperti pipa.BONUS Jawab
Anda tidak perlu melakukan terlalu banyak untuk menggunakan ini. Sejauh menyangkut skrip Anda, skrip ini mendapatkan nama file yang valid pada baris perintah, yang dapat dibuka () seperti yang lainnya. Seperti yang orang lain katakan, Anda akan lihat
diff /dev/fd/XX /dev/fd/YY
. Jika Anda melakukan stat () pada salah satu file pseudo ini, Anda akan melihat itu adalah nama pipa, dan Anda harus memperlakukannya dengan semantik pipa - yaitu tanpa fseek () atau ftell (). Jika Anda melakukan tes stat () untuk secara eksplisit melihat apakah itu file (misalnya[ -f $1 ]
) ini akan pecah - ini diimplementasikan sebagai pipa bernama setelah semua.sumber
<(...)
melakukan proses substitusi dalam bash. Output dari proses dalam parens dikirim ke file deskriptor tambahan di luar 3 normal, dan nama file dikembalikan sesuai dengan deskriptor file itu. Dengan cara ini, output dari suatu perintah dapat diperlakukan sebagai nama file untuk diteruskan ke perintah lain.sumber
Ada satu
stdin
dan satustdout
untuk setiap proses . Mereka biasanya terhubung ke terminal, tetapi mereka dapat dialihkan secara terpisah dari satu sama lain.Dalam contoh tersebut, ada dua
wget
proses yang terlibat, masing-masing mendapatkan sendiristdin
danstdout
. Setiapwget
proses menulis-
, yang merupakan prosesnyastdout
. Kemudianbash
substitusi proses<(...)
menghubungkanstdout
proses ke file pseudo yang unik, yangdiff
dapat dibaca. Perhatikan bahwa dua proses penggantian menghasilkan dua file pseudo yang berbeda! Jadi,diff
lihat sesuatu seperti:dimana
stdout
dariwget -q -O - URL1
terhubung ke/dev/fd/XX
, danstdout
dariwget -q -O - URL2
ke/dev/fd/YY
.sumber