Aralarındaki farkı kırmanın iyi bir yolu, komut satırında biraz deneme yapmaktır. <
Karakterin kullanımındaki görsel benzerliğe rağmen, bir yönlendirme veya borudan çok farklı bir şey yapar.
date
Test etmek için komutu kullanalım .
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Bu anlamsız bir örnektir, ancak STDIN'in cat
çıktısını kabul ettiğini date
ve tükürdüğünü göstermektedir. Proses ikamesiyle aynı sonuçlar elde edilebilir:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
Ancak sahnelerin ardında ne olduğu farklıydı. Bir STDIN akışı verilmesi yerine cat
, aslında açılıp okunması gereken bir dosyanın adı geçildi. Bu adımı echo
yerine kullanarak görebilirsiniz cat
.
$ echo <(date)
/proc/self/fd/11
Cat dosya adını aldığında, dosyanın içeriğini bizim için okur. Öte yandan, yankı az önce bize dosyanın geçtiğini gösterdi. Daha fazla değişiklik eklerseniz, bu fark daha belirgin hale gelir:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
İşlem değiştirme (bir dosya üreten) ve giriş yönlendirmesini (bir dosyayı STDIN'e bağlayan) birleştirmek mümkündür:
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Neredeyse aynı görünüyor ama bu sefer kedi bir dosya adı yerine STDIN akışından geçirildi. Bunu eko ile deneyerek görebilirsiniz:
$ echo < <(date)
<blank>
Yankı STDIN'i okumadığı ve hiçbir argüman geçmediği için hiçbir şey alamadık.
Borular ve giriş yönlendirmeleri içeriği STDIN akışına sürükler. İşlem değiştirme komutları çalıştırır, çıktılarını özel bir geçici dosyaya kaydeder ve ardından bu dosya adını komut yerine geçirir. Hangi komutu kullanıyorsanız kullanın, onu bir dosya adı olarak kabul eder. Oluşturulan dosyanın normal bir dosya olmadığını, artık gerekmediğinde otomatik olarak kaldırılan adlandırılmış bir kanal olduğunu unutmayın.