Jawaban:
Jika Anda seorang programmer C, Anda dapat menganggapnya &1sebagai "alamat 1" sehingga 2>&1berbunyi "redirect file descriptor # 2 ke tempat yang sama dengan # 1".
"Dua ke dan satu" ("menjadi" makhluk >) lebih masuk akal bagi saya daripada "Dua ke satu", yang biasanya saya bingungkan dengannya. Jika Anda menganggap "dan satu" sebagai kata benda tunggal (suatu tempat), itu juga masuk akal secara tata bahasa dalam konteks, yang lebih sulit dilakukan dengan "Dua dan satu" - Anda harus mempertimbangkan "satu" satu kata benda, dan itu masih tidak akan masuk akal kontekstual.
Bukan mnemonik, tetapi saya membacanya sebagai berikut:
0adalah stdin.
1adalah stdout.
2adalah stderr.
>masuk ke.
<keluar dari.
&adalah file descriptor (dalam beberapa shell).
2>&1
2 > & 1
stderr into file descriptor 1
redirect stderr into stdout
Mungkin berubah jika Anda telah mengacaukan salah satu deskriptor file sebelum pengalihan ...
2>somefile 1>&2
2 > somefile 1 > &2
stderr into somefile and stdout into file descriptor 2
redirect stderr into somefile and stdout into somefile.
Saat Anda menulis 2>&1, Anda mengatakan "kesalahan standar masuk ke output standar".
Mari kita hancurkan itu.
Pertama Anda ingin mengingat kesalahan 2standar dan output standar 1.
Jadi, Anda punya 2sesuatu 1.
"Pergi ke" ditulis >.
Jadi kamu punya 2>sesuatu 1.
2>filenameberarti mengirim kesalahan standar ke filename. Tetapi Anda tidak ingin mengirimnya ke file bernama 1. Anda menginginkan sesuatu yang lain: jumlah file yang sudah terbuka. Itu untuk apa &.
Jadi 2>&1.
Anda juga dapat menganggapnya seperti sedang melakukan tugas, di mana >itu seperti yang sama dan yang &seperti $, bandingkan:
f=$1
2>&1
Untuk memahami baris perintah dengan beberapa pengalihan, hal yang penting untuk diketahui adalah bahwa pengalihan dilakukan dari kiri ke kanan. Lihat Urutan pengalihan untuk detail lebih lanjut tentang itu.
Jika Anda mengerti bahwa FD2 adalah STDERR, Anda mungkin berpikir, "Oh, dan tangkap STDERR di mana pun saya mengirim STDOUT (FD1)".
Rekan kerja saya dan saya biasanya mengatakan "dua lebih besar dari satu", karena kebanyakan dari kita tidak selalu ingat bahwa stderradalah file descriptor 2dan stdoutadalah 1(terutama mereka yang baru unix / linux), sehingga mnemonik lainnya tentang mengarahkan stderrtidak benar-benar bekerja . Satu-satunya masalah adalah, Anda masih harus mengingat di mana ampersand pergi!