Jauh lebih mudah untuk memvisualisasikan hal-hal jika Anda berpikir tentang apa yang sebenarnya terjadi dengan "pengalihan" dan "pipa." Arahan ulang dan pipa dalam bash melakukan satu hal: memodifikasi tempat file deskriptor 0, 1, dan 2 menunjuk ke (lihat / proc / [pid] / fd / *).
Ketika sebuah pipa atau "|" operator hadir pada baris perintah, hal pertama yang terjadi adalah bahwa bash menciptakan fifo dan mengarahkan FD1 perintah sisi kiri ke fifo ini, dan mengarahkan FD 0 perintah sisi kanan ke fifo yang sama.
Selanjutnya, operator pengalihan untuk setiap sisi dievaluasi dari kiri ke kanan , dan pengaturan saat ini digunakan setiap kali duplikasi deskriptor terjadi. Ini penting karena sejak pipa dipasang pertama kali, FD1 (sisi kiri) dan FD0 (sisi kanan) sudah berubah dari yang biasanya, dan duplikasi ini akan mencerminkan fakta itu.
Karena itu, ketika Anda mengetikkan sesuatu seperti berikut:
command 2>&1 >/dev/null | grep 'something'
Inilah yang terjadi, secara berurutan:
- sebuah pipa (fifo) dibuat. "command FD1" diarahkan ke pipa ini. "grep FD0" juga menunjuk ke pipa ini
- "command FD2" diarahkan ke tempat "command FD1" saat ini menunjuk (pipa)
- "perintah FD1" menunjuk ke / dev / null
Jadi, semua output yang "perintah" tulis ke FD 2 (stderr) membuat jalan ke pipa dan dibaca oleh "grep" di sisi lain. Semua output yang "perintah" tulis ke FD 1 (stdout) menuju ke / dev / null.
Jika sebaliknya, Anda menjalankan yang berikut:
command >/dev/null 2>&1 | grep 'something'
Inilah yang terjadi:
- sebuah pipa dibuat dan "perintah FD 1" dan "grep FD 0" diarahkan ke sana
- "perintah FD 1" diarahkan ke / dev / null
- "command FD 2" diarahkan ke tempat FD 1 saat ini menunjuk (/ dev / null)
Jadi, semua stdout dan stderr dari "command" menuju ke / dev / null. Tidak ada yang masuk ke pipa, dan dengan demikian "grep" akan menutup tanpa menampilkan apa pun di layar.
Perhatikan juga bahwa pengalihan (deskriptor file) dapat berupa read-only (<), only-write (>), atau read-write (<>).
Catatan terakhir. Apakah program menulis sesuatu ke FD1 atau FD2, sepenuhnya tergantung pada programmer. Praktik pemrograman yang baik menentukan bahwa pesan kesalahan harus masuk ke FD 2 dan output normal ke FD 1, tetapi Anda akan sering menemukan pemrograman yang ceroboh yang menggabungkan keduanya atau mengabaikan konvensi.