Seperti yang dikatakan orang lain, linux menyediakan dua aliran keluaran yang berbeda:
stdout , atau "output standar" adalah tempat semua output biasa berjalan.
Anda dapat referensi menggunakan deskriptor file 1
.
stderr , atau "standard error" adalah aliran terpisah untuk informasi out-of-band.
Anda dapat referensi menggunakan deskriptor file 2
.
Mengapa dua aliran output berbeda? Pertimbangkan pipa perintah imajiner:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Sekarang bayangkan decrypt
perintah gagal dan menghasilkan pesan kesalahan. Jika mengirim pesan stdout
itu, itu akan mengirim ke pipa, dan kecuali jika ada kata "rahasia" Anda tidak akan pernah melihatnya. Jadi, Anda akan berakhir dengan file output kosong, tanpa tahu apa yang salah.
Namun, karena pipa hanya menangkap stdout
, decrypt
perintah dapat mengirim kesalahannya ke stderr
, di mana mereka akan ditampilkan di konsol.
Anda dapat mengarahkan stdout
dan stderr
, baik bersama-sama atau secara mandiri:
# Send errors to "errors.txt" and output to "secrets.txt"
# The following two lines are equivalent, as ">" means "1>"
decrypt $MY_FILE 2> errors.txt > secrets.txt
decrypt $MY_FILE 2> errors.txt 1> secrets.txt
Anda dapat mengarahkan kesalahan ke stdout
dan memprosesnya seolah-olah itu adalah output normal:
# The operation "2>&1" means "redirect file descriptor 2 to file
# descriptor 1. So this sends all output from stderr to stdout.
# Note that the order of redirection is important.
decrypt $MY_FILE > errors.txt 2>&1
# This may be confusing. It will store the normal output in a file
# and send error messages to stdout, where they'll be captured by
# the pipe and then sorted.
decrypt $MY_FILE 2>&1 > output.txt | sort
Anda juga dapat menggunakan "singkatan" notasi untuk mengarahkan kedua stdout dan stderr ke file yang sama:
decrypt $MY_FILE &> output.txt
Dan, akhirnya, >
operator akan terlebih dahulu memotong file outputnya sebelum menulis ke sana. Sebaliknya, jika Anda ingin menambahkan data ke file yang ada, gunakan >>
operator:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1