Saya tahu bahwa >
tanda digunakan untuk pengalihan output di baris perintah, tapi saya mengalami kesulitan menemukan sesuatu yang menjelaskan penggunaan 2>&1
di baris perintah. Sebagai contoh:
curl http://www.google.com > /dev/null 2>&1 &
command-line
shell
redirection
Matt Huggins
sumber
sumber
Jawaban:
The
1
Menandakan output standar (stdout). Yang2
menunjukkan kesalahan standar (stderr).Jadi
2>&1
mengatakan untuk mengirim kesalahan standar ke tempat keluaran standar sedang dialihkan juga. Yang sejak itu dikirim/dev/null
sama dengan mengabaikan output sama sekali.sumber
0
(stdin),1
(stdout) dan2
(stderr) sebenarnya adalah deskriptor file, shell memerlukan ampers dan diletakkan di depannya untuk pengalihan. Ini duplikat deskriptor file dalam hal ini secara efektif menggabungkan dua aliran informasi bersama.curl http://www.google.com 2>/dev/null
Bagaimana baris perintah tahu bahwa "2" di sini dimaksudkan untuk berarti stderr dan sebenarnya bukan parameter kedua yang saya sampaikan ke perintah curl?stderr
langsung ke/dev/null
gantinya. Anda dapat melihatnya dalam praktek dengan mencobacurl
,curl 1>/dev/null
dancurl 2>/dev/null
hanya untuk melihat perubahan output. Sekali lagi ampersand hanya diperlukan untuk deskriptor file yang dialihkan ke.tl; dr
Ambil
http://www.google.com
di latar belakang dan buang keduastdout
danstderr
.sama dengan
Dasar-dasar
0
,1
dan2
mewakili deskriptor file standar dalam sistem operasi POSIX . Deskriptor file adalah referensi sistem untuk (pada dasarnya) file atau socket .0 stdin
1 stdout
2 stderr
Membuat deskriptor file baru di C dapat terlihat seperti ini:
Sebagian besar perintah sistem Unix mengambil beberapa input dan output hasilnya ke terminal.
curl
akan mengambil apa pun yang ada di url yang ditentukan ( google dot com ) dan menampilkan hasilnyastdout
.Pengalihan
Seperti yang Anda katakan
<
dan>
digunakan untuk mengarahkan output dari perintah ke tempat lain, seperti file.Sebagai contoh, in
ls > myfiles.txt
,ls
mendapatkan isi direktori saat ini dan>
mengarahkan kembali hasilnyamyfiles.txt
(jika file tidak ada, dibuat, jika tidak ditimpa, tetapi Anda dapat menggunakan>>
alih-alih>
menambahkan ke file sebagai gantinya). Jika Anda menjalankan perintah di atas, Anda akan melihat tidak ada yang ditampilkan ke terminal. Itu biasanya berarti sukses dalam sistem Unix. Untuk memeriksa inicat myfiles.txt
untuk menampilkan konten file ke layar.> / dev / null 2> & 1
Bagian pertama
> /dev/null
mengarahkan ulangstdout
, yaitucurl
output ke/dev/null
(lebih lanjut tentang ini di depan) dan2>&1
mengarahkan kembalistderr
kestdout
(yang baru saja diarahkan ke/dev/null
sehingga semuanya akan dikirim ke/dev/null
).Sisi kiri
2>&1
memberi tahu Anda apa yang akan diarahkan, dan sisi kanan memberi tahu Anda ke mana . The&
digunakan di sisi kanan untuk membedakanstdout (1)
ataustderr (2)
dari file bernama1
atau2
. Jadi,2>1
akhirnya akan membuat file baru (jika belum ada) bernama1
dan buangstderr
hasilnya di sana./ dev / null
/dev/null
adalah file kosong, mekanisme yang digunakan untuk membuang semua yang ditulis padanya. Jadi,curl http://www.google.com > /dev/null
secara efektif menekancurl
output.Tetapi mengapa masih ada beberapa barang yang ditampilkan di terminal? Ini bukan
curl
keluaran reguler, tetapi data dikirim kestderr
, digunakan di sini untuk menampilkan kemajuan dan informasi diagnostik dan bukan hanya kesalahan .curl http://www.google.com > /dev/null 2>&1
mengabaikancurl
keluaran dancurl
informasi kemajuan keduanya . Hasilnya tidak ada yang ditampilkan di terminal.Akhirnya
Yang
&
terakhir adalah bagaimana Anda memberi tahu shell untuk menjalankan perintah sebagai pekerjaan di latar belakang . Ini menyebabkan prompt untuk kembali segera ketika perintah dijalankan secara tidak sinkron di belakang layar. Untuk melihat jenis pekerjaan saat inijobs
di terminal Anda. Perhatikan ini berbeda dari proses yang berjalan di sistem Anda. Untuk melihat jenis itutop
di terminal.Referensi
sumber
/dev/null
? Tidakkah Anda ingin hasil daricurl
setidaknya suatu tempat berguna?2
mengacu pada STDERR.2>&1
akan mengirim STDERR ke lokasi yang sama dengan1
(STDOUT).sumber
Saya mengerti sebagai berikut:
Jika Anda hanya ingin membaca informasi Keluaran dan Kesalahan dari perintah di layar, maka cukup tulis:
curl http://www.google.com
Dan beberapa kali Anda ingin menyimpan informasi Output ke file bukan layar terminal untuk ditinjau nanti, maka Anda dapat menulis:
curl http://www.google.com > logfile
Tetapi dengan cara ini, informasi StdErr akan dihilangkan, karena
>
hanya mengarahkan StdOut kelogfile
.Jadi, jika Anda peduli dengan informasi kesalahan perintah setelah gagal dieksekusi, maka Anda perlu menggabungkan StdOut dengan StdErr dengan menggunakan
2>&1
(yang berarti lipat StdErr ke StdOut), sehingga baris perintah berikut dapat ditulis:curl http://www.google.com > logfile
2> & 1sumber