"Yönlendirmeler" ve "kanallar" ile gerçekten neler olup bittiğini düşünüyorsanız, görselleştirmek çok daha kolaydır. Bash içindeki yönlendirmeler ve kanallar bir şey yapar: 0, 1 ve 2 işlem dosyası tanımlayıcılarının (bkz. / Proc / [pid] / fd / *) işaret ettiği yeri değiştirin.
Ne zaman bir boru veya "|" operatör komut satırında bulunur, gerçekleşecek ilk şey bash'ın bir fifo oluşturması ve sol taraf komutunun FD 1'ini bu fifoya işaret etmesi ve sağ taraf komutunun FD 0'ını aynı fifo'ya göstermesidir.
Daha sonra, her bir taraf için yönlendirme işleçleri soldan sağa değerlendirilir ve tanımlayıcı çoğaltıldığında geçerli ayarlar kullanılır. Bu önemlidir, çünkü boru ilk olarak kurulduğundan, FD1 (sol taraf) ve FD0 (sağ taraf) normalde olduğundan daha önce değiştirilmiştir ve bunların tekrarlanması bu gerçeği yansıtacaktır.
Bu nedenle, aşağıdaki gibi bir şey yazdığınızda:
command 2>&1 >/dev/null | grep 'something'
Sırayla ne olur:
- bir boru (fifo) oluşturulur. "FD1 komutu" bu boruya işaret ediyor. "grep FD0" da bu boruya işaret ediyor
- "Komut FD2", "Komut FD1" in şu anda işaret ettiği yere işaret edilir (boru)
- "FD1 komutu" / dev / null
Böylece, "komut" un FD 2'sine (stderr) yazdığı tüm çıktılar boruya gider ve diğer tarafta "grep" tarafından okunur. "Komut" un FD 1 (stdout) 'a yazdığı tüm çıktılar / dev / null yolunu açar.
Bunun yerine, aşağıdakileri çalıştırın:
command >/dev/null 2>&1 | grep 'something'
İşte olanlar:
- bir boru oluşturulur ve "komut FD 1" ve "grep FD 0" işaret edilir.
- "FD 1 komutu" / dev / null
- "FD 2 komutu", FD 1'in şu anda işaret ettiği yere (/ dev / null) işaret ediyor
Yani, "komut" dan tüm stdout ve stderr / dev / null'a gider. Hiçbir şey boruya gitmez ve böylece "grep" ekranda hiçbir şey göstermeden kapanır.
Ayrıca yeniden yönlendirmelerin (dosya tanımlayıcıları) salt okunur (<), salt okunur (>) veya okuma-yazma (<>) olabileceğini unutmayın.
Son bir not. Bir programın FD1 veya FD2'ye bir şey yazıp yazmadığı tamamen programcıya bağlıdır. İyi programlama uygulaması, hata mesajlarının FD 2'ye ve normal çıkışın FD 1'e gitmesi gerektiğini belirtir, ancak genellikle ikisini karıştıran ya da konvansiyonu görmezden gelen özensiz programlama bulacaksınız.