Ini bukan beberapa input standar. Ini adalah bash'isme yang disebut 'Pergantian Proses'http://tldp.org/LDP/abs/html/process-sub.html
Itu membuat file pseudo (/dev/fd/something
) untuk setiap substitusi. Ini sangat berguna. Perintah hanya bisa dibaca sebagai aliran, artinya tidak bisa bolak-balik dengan fseek. Perlu membacanya sebagai aliran byte, seperti pipa.
Jawaban BONUS
Anda tidak perlu melakukan terlalu banyak untuk menggunakan ini. Sejauh menyangkut skrip Anda, ia mendapat nama file yang valid di baris perintah, yang dapat dibuka () seperti yang lainnya. Seperti yang dikatakan orang lain, Anda akan melihat diff /dev/fd/XX /dev/fd/YY
. Jika Anda melakukan stat() pada salah satu file pseudo ini, Anda akan melihat itu adalah pipa bernama, dan Anda harus memperlakukannya dengan semantik pipa - yaitu tidak ada fseek() atau ftell(). Jika Anda melakukan tes stat() untuk secara eksplisit melihat apakah itu file (mis. [ -f $1 ]
) ini akan break - ini diimplementasikan sebagai pipa bernama.
<(...)
apakah memproses substitusi di pesta. Output dari proses di parens dikirim ke deskriptor file tambahan di luar normal 3, dan nama file dikembalikan sesuai dengan deskriptor file tersebut. Dengan cara ini output dari perintah dapat diperlakukan sebagai nama file untuk diteruskan ke perintah lain.
Ada satu stdin
dan satu stdout
untuk setiap proses . Mereka biasanya terhubung ke terminal, tetapi mereka dapat dialihkan secara terpisah satu sama lain.
Dalam contoh, ada dua wget
proses yang terlibat, yang masing-masing mendapatkan stdin
sendiri dan stdout
. Setiap wget
proses menulis ke -
, yaitu stdout
. Lalu bash
substitusi proses <(...)
menghubungkan stdout
dari proses ke file pseudo unik, dari mana diff
dapat membaca. Perhatikan bahwa dua substitusi proses menghasilkan dua file pseudo yang berbeda! Jadi, diff
melihat sesuatu seperti:
diff /dev/fd/XX /dev/fd/YY
di mana stdout
dari wget -q -O - URL1
terhubung ke /dev/fd/XX
, dan stdout
dari wget -q -O - URL2
ke /dev/fd/YY
.