Saya mencoba memahami pipa bernama dalam konteks contoh khusus ini.
Saya mengetik <(ls -l)
terminal saya dan mendapatkan output sebagai bash: /dev/fd/63: Permission denied
,.
Jika saya mengetik cat <(ls -l)
, saya bisa melihat isi direktori. Jika saya mengganti cat
dengan echo
, saya pikir saya mendapatkan nama terminal (atau itu?).
echo <(ls -l)
memberikan output sebagai /dev/fd/63
.
Juga, contoh output ini tidak jelas bagi saya.
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
Namun, jika saya memberi, ls -l <()
itu mencantumkan saya isi direktori.
Apa yang terjadi dalam kasus pipa bernama?
mkfifo
hanya membuat pipa bernama, tanpa konten apa pun. Jadi, Anda perlu menulis sendiri (mismkfifo mypipe; ls > mypipe
.). Dan ya, tulisan ke pipa akan diblok sampai beberapa proses membaca dari pipa./dev/fd/63
adalah pipa anonim.file <(ls)
. Shell memang membuat pipa anonim, tetapi deskriptor file mencerminkan sebagai pipa bernama di/dev/fd
. Jika itu adalah pipa anonim, itu tidak akan memiliki nama dan tidak bisa dibuka oleh perintah yang/dev/fd/63
dilewati./dev/fd
dapat merujuk ke file apa pun deskriptor, bahkan pipa dan soket anonim, soket jaringan, segmen memori bersama, dll.Anda salah memahami
ls
perintah dan pengalihan.ls
daftar file dan direktori yang diberikan pada baris perintah, saya tidak percaya menerima input dari stdin. Pengalihan>
>>
dan<
merupakan cara untuk menggunakan file untuk memberi input dan mengumpulkan output.sumber
<(…)
adalah proses substitusi.x|y
dan hampir identik dengan[num]<<REDIRECT
di beberapa cangkang. Perbedaannya adalah substitusi literal dari tautan fd -/dev/fd/63
dan lain-lain dan apa fungsinya - atau tidak dilakukan - dengan stdin. Lakukanecho | readlink /dev/fd/0
dan lihat sendiri.dev
tautan - file khusus. Anda dapat melakukan hal yang sama dengan deskriptor file apa saja pada sebagian besar sistem linux - bahkan tipikal|pipes
, meskipun saya tidak menjamin perilaku di tempat lain. saya mendapatkan dari mana Anda berasal, tetapi pipa bernama adalah hal yang terpisah untuk dirinya sendiri - ini adalah referensi sistem file ke pipa di-kernel - referensi sistem file biasa , bukan file perangkat./dev/fd/*
membuat pipa bernama di tempat lain. Tapi saya berpendapat bahwa/dev/fd/*
itu sendiri adalah mekanisme yang berbeda dari pipa bernama. Secara kebetulan, deskripsi Wikipedia dapat dilakukan dengan penjelasan tentang perbedaan ini./dev/fd/*
tidak tersedia, bash akan membuat pipa bernama/tmp
, dan menggunakannya sebagai pengganti proses. Sepertinya tidak aneh bagi saya, hanya membuat fungsionalitas tersedia di lingkungan sebanyak mungkin.