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 &>
?the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
. Apa yang Anda maksud dengan deskriptor file yang sudah diatur? Apa artinya itu hak?Satu situasi ketika Anda membutuhkannya adalah ketika Anda ingin menampilkan
strace
output dalam pager.strace
mencetak outputnya ke standard error dan pipa umumnya menghubungkan output standar ke input standar, jadi Anda harus menggunakan redirect:sumber
pipes generally connect standard output to standard input
?|
) mengambil output standar dari perintah pertama dan menghubungkannya ke input standar dari perintah kedua.Terkadang Anda ingin mengalihkan keduanya
stdout
(1
) danstderr
(2
) ke lokasi yang sama (/dev/null
, misalnya). Salah satu cara untuk mencapai ini adalah:Tapi kebanyakan orang mempersingkat ini dengan mengarahkan
stderr
kestdout
dengan2>&1
:Versi yang lebih pendek adalah:
sumber
2: Ini untuk ketika Anda akan memiliki output yang berasal dari standard error dan standard out, dan Anda ingin mereka dikomposisi menjadi satu string.
1: Ketika Anda ingin memanipulasi output dari standard error dan standard out.
sumber
>2
dikirim ke / dev / null. Atau apakah saya salah sepenuhnya?Saya menggunakannya untuk memulai pekerjaan terpisah:
maka saya bisa keluar, dan beberapa program akan tetap berjalan. Fungsionalitas disediakan oleh Layar GNU, tmux dan beberapa program lainnya - tetapi di sini ia dicapai tanpa ketergantungan eksternal.
sumber
nohup
ataudisown
dalam kasus seperti itu.Bayangkan ada direktori bernama
try
yang memiliki tiga file ini:file file1 and file2.
Sekarang jalankan perintah ini:
Tiga file pertama terbuka tetapi
cat
melempar kesalahan saat membuka yang keempat karena tidak ada.Sekarang jalankan:
Anda tidak akan melihat output apa pun di layar: Pertama
1>outfile
akan mengarahkan output dari perintah keoutfile
dan kemudian akan mengarahkan ulang (2>&1
) kesalahan yang dilemparkan saat mencoba membukafile3
keoutfile
.1>&2
bekerja dengan cara yang sama dan mengarahkan aliran kesalahan ke output standar.Semoga ini membantu!
sumber
Gunakan
tty
perintah di setiap terminal untuk mengidentifikasi mereka:Dengan asumsi TTY ini, untuk mengarahkan stdout pertama ke yang kedua, jalankan ini di terminal pertama:
Untuk mengembalikan stdout perilaku default dari Poin / 0:
Lihat video ini untuk demonstrasi.
sumber
Kasus ketika mengarahkan kembali stderr ke stdout sudah dibahas di sini (misalnya menggunakannya untuk memfilter (grep) pesan kesalahan).
Kasus lainnya adalah mengarahkan stdout ke stderr. Usecase umum (setidaknya bagi saya) adalah mengirim peringatan / pesan kesalahan yang dicetak dengan "echo" (dalam skrip shell saya) ke stderr (sehingga mereka dapat menarik perhatian pengguna dengan lebih mudah).
Sebagai contoh,
sumber