Terkadang Anda ingin mengarahkan stdout dan stderr ke lokasi yang sama, Ini saat >&
digunakan - ini mengarahkan satu deskriptor file ke yang lain.
Misalnya, jika Anda ingin menulis kedua stdout dan stderr ke file yang sama (baik itu /dev/null
atau output.txt
), Anda dapat mengarahkan mereka secara terpisah, dengan
app 1>/dev/null 2>/dev/null
atau Anda bisa mengarahkan satu deskriptor file ke file, dan deskriptor file lainnya ke yang pertama:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
Dalam contoh pertama, 2>&1
arahkan file descriptor # 2 ke tempat # 1 sudah menunjuk. Contoh kedua mencapai hal yang sama, hanya mulai dengan stderr saja.
Sebagai contoh lain, ada beberapa kasus ketika stdout (deskriptor file # 1) sudah menunjuk ke lokasi yang diinginkan, tetapi Anda tidak dapat merujuknya dengan nama (mungkin terkait dengan pipa, soket, atau semacamnya). Ini sering terjadi ketika menggunakan ekspansi proses ( ` `
atau $( )
operator), yang biasanya hanya menangkap stdout, tetapi Anda mungkin ingin menyertakan stderr di dalamnya. Dalam hal ini, Anda juga akan menggunakan >&
untuk mengarahkan stderr ke stdout:
out=$(app 2>&1)
Contoh umum lainnya adalah pager, atau grep
, atau utilitas serupa, karena pipa |
biasanya hanya bekerja di stdout, Anda akan mengarahkan stderr ke stdout sebelum menggunakan pipa:
app 2>&1 | grep hello
Bagaimana tahu mana 2>&1
atau 1>&2
benar? The sudah menyiapkan file descriptor pergi ke kanan >&
, dan file descriptor Anda ingin redirect pergi ke kiri. ( 2>&1
berarti "titik file descriptor # 2 ke file descriptor # 1".)
Beberapa shell memiliki jalan pintas untuk pengalihan umum; berikut adalah contoh dari Bash:
1>
dapat disingkat menjadi adil >
1>foo 2>&1
ke >&foo
atau&>foo
2>&1 | program
untuk |& program
app 1>/dev/null 2>&1
berarti 2> & 1 akan menunjuk ke file yang sudah saya alihkan. Saya mengambilnya, saya bisa dengan mudah melakukannyaapp > /dev/null &>
?