Satu baris dengan 2 file tmp (bukan yang Anda inginkan) adalah:
foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt
Dengan bash , Anda dapat mencoba:
diff <(foo | bar) <(baz | quux)
foo | bar | diff - <(baz | quux) # or only use process substitution once
Versi ke-2 akan lebih jelas mengingatkan Anda input mana yang, dengan menunjukkan
-- /dev/stdin
vs. ++ /dev/fd/63
atau sesuatu, bukan dua fds bernomor.
Bahkan pipa bernama tidak akan muncul di sistem file, setidaknya pada OS di mana bash dapat mengimplementasikan substitusi proses dengan menggunakan nama file seperti /dev/fd/63
untuk mendapatkan nama file yang dapat dibuka dan dibaca oleh perintah untuk benar-benar membaca dari deskriptor file yang sudah terbuka yang diatur oleh bash set sebelum menjalankan perintah. (Yaitu bash menggunakan pipe(2)
sebelum garpu, dan kemudian dup2
untuk mengalihkan dari output quux
ke deskripsi file input untukdiff
, pada fd 63.)
Pada sistem tanpa "ajaib" /dev/fd
atau /proc/self/fd
, bash mungkin menggunakan pipa bernama untuk mengimplementasikan substitusi proses, tetapi setidaknya akan mengelolanya sendiri, tidak seperti file sementara, dan data Anda tidak akan ditulis ke sistem file.
Anda dapat memeriksa bagaimana bash mengimplementasikan proses substitusi dengan echo <(true)
mencetak nama file alih-alih membacanya. Mencetak /dev/fd/63
pada sistem Linux yang khas. Atau untuk detail lebih lanjut tentang apa tepatnya panggilan sistem yang digunakan bash, perintah ini pada sistem Linux akan melacak panggilan sistem dan file-deskriptor panggilan
strace -f -efile,desc,clone,execve bash -c '/bin/true | diff -u - <(/bin/true)'
Tanpa bash, Anda bisa membuat pipa bernama . Gunakan -
untuk memberi tahu diff
untuk membaca satu input dari STDIN, dan menggunakan pipa bernama sebagai yang lain:
mkfifo file1_pipe.txt
foo|bar > file1_pipe.txt && baz | quux | diff file1_pipe.txt - && rm file1_pipe.txt
Perhatikan bahwa Anda hanya dapat menyalurkan satu output ke beberapa input dengan perintah tee:
ls *.txt | tee /dev/tty txtlist.txt
Perintah di atas menampilkan output dari ls * .txt ke terminal dan outputnya ke file teks txtlist.txt.
Tetapi dengan substitusi proses, Anda dapat menggunakan tee
untuk memberi makan data yang sama ke beberapa saluran pipa:
cat *.txt | tee >(foo | bar > result1.txt) >(baz | quux > result2.txt) | foobar
mkfifo a; cmd >a& cmd2|diff a -; rm a