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 &
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 &
Jawaban:
The 1
Menandakan output standar (stdout). Yang 2
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.
0
(stdin), 1
(stdout) dan 2
(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 mencoba curl
, curl 1>/dev/null
dan curl 2>/dev/null
hanya untuk melihat perubahan output. Sekali lagi ampersand hanya diperlukan untuk deskriptor file yang dialihkan ke.
Ambil http://www.google.com
di latar belakang dan buang kedua stdout
dan stderr
.
curl http://www.google.com > /dev/null 2>&1 &
sama dengan
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
dan 2
mewakili deskriptor file standar dalam sistem operasi POSIX . Deskriptor file adalah referensi sistem untuk (pada dasarnya) file atau socket .
Membuat deskriptor file baru di C dapat terlihat seperti ini:
fd = open("data.dat", O_RDONLY)
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 hasilnya stdout
.
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 hasilnya myfiles.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 ini cat myfiles.txt
untuk menampilkan konten file ke layar.
Bagian pertama > /dev/null
mengarahkan ulang stdout
, yaitu curl
output ke /dev/null
(lebih lanjut tentang ini di depan) dan 2>&1
mengarahkan kembali stderr
ke stdout
(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 membedakan stdout (1)
atau stderr (2)
dari file bernama 1
atau 2
. Jadi, 2>1
akhirnya akan membuat file baru (jika belum ada) bernama 1
dan buang stderr
hasilnya di sana.
/dev/null
adalah file kosong, mekanisme yang digunakan untuk membuang semua yang ditulis padanya. Jadi,
curl http://www.google.com > /dev/null
secara efektif menekan curl
output.
Tetapi mengapa masih ada beberapa barang yang ditampilkan di terminal? Ini bukan curl
keluaran reguler, tetapi data dikirim ke stderr
, digunakan di sini untuk menampilkan kemajuan dan informasi diagnostik dan bukan hanya kesalahan .
curl http://www.google.com > /dev/null 2>&1
mengabaikan curl
keluaran dan curl
informasi kemajuan keduanya . Hasilnya tidak ada yang ditampilkan di terminal.
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 ini jobs
di terminal Anda. Perhatikan ini berbeda dari proses yang berjalan di sistem Anda. Untuk melihat jenis itu top
di terminal.
/dev/null
? Tidakkah Anda ingin hasil dari curl
setidaknya suatu tempat berguna?
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 ke logfile
.
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> & 1