Perlu dicatat bahwa proses substitusi tidak terbatas pada formulir <(command)
, yang menggunakan output command
sebagai file. Itu bisa dalam bentuk >(command)
yang mengumpankan file sebagai input command
juga. Ini juga disebutkan dalam kutipan manual bash dalam jawaban @ enzotib.
Untuk date | cat
contoh di atas, perintah yang menggunakan proses substitusi formulir >(command)
untuk mencapai efek yang sama adalah,
date > >(cat)
Perhatikan bahwa >
sebelumnya >(cat)
diperlukan. Sekali lagi ini dapat digambarkan dengan jelas echo
seperti pada jawaban @ Caleb.
$ echo >(cat)
/dev/fd/63
Jadi, tanpa tambahan >
, date >(cat)
akan sama dengan date /dev/fd/63
yang akan mencetak pesan ke stderr.
Misalkan Anda memiliki program yang hanya menggunakan nama file sebagai parameter dan tidak memproses stdin
atau stdout
. Saya akan menggunakan skrip yang terlalu disederhanakan psub.sh
untuk menggambarkan hal ini. Isi psub.sh
is
#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"
Pada dasarnya, ini menguji bahwa kedua argumennya adalah file (tidak harus file biasa) dan jika ini masalahnya, tulislah bidang pertama dari setiap baris "$1"
untuk "$2"
menggunakan awk. Kemudian, perintah yang menggabungkan semua yang disebutkan sejauh ini adalah,
./psub.sh <(printf "a a\nc c\nb b") >(sort)
Ini akan dicetak
a
b
c
dan setara dengan
printf "a a\nc c\nb b" | awk '{print $1}' | sort
tetapi yang berikut tidak akan berfungsi, dan kami harus menggunakan proses substitusi di sini,
printf "a a\nc c\nb b" | ./psub.sh | sort
atau bentuknya yang setara
printf "a a\nc c\nb b" | ./psub.sh /dev/stdin /dev/stdout | sort
Jika ./psub.sh
juga membaca stdin
selain apa yang disebutkan di atas, maka bentuk setara seperti itu tidak ada, dan dalam hal itu tidak ada yang bisa kita gunakan sebagai pengganti proses substitusi (tentu saja Anda juga dapat menggunakan pipa atau file temp bernama, tapi itu lain cerita).