Apa yang dilakukan “2> & 1” di baris perintah?

Jawaban:

78

The 1Menandakan output standar (stdout). Yang 2menunjukkan kesalahan standar (stderr).

Jadi 2>&1mengatakan untuk mengirim kesalahan standar ke tempat keluaran standar sedang dialihkan juga. Yang sejak itu dikirim /dev/nullsama dengan mengabaikan output sama sekali.

Chealion
sumber
2
Apakah ada alasan bahwa ampersand muncul sebelum angka 1, tetapi tidak sebelum angka 2? Saya pikir & adalah karakter yang dilindungi untuk menjalankan pekerjaan di latar belakang, tapi saya kira itu hanya jika ampersand muncul sebagai karakter panjang di akhir perintah ...?
Matt Huggins
8
Karena 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.
Chealion
12
Pikirkan seperti ini: jika Anda baru saja "1" tanpa ampersand, shell akan membuat file bernama "1" dan mengarahkan output stderr ke sana.
CarlF
1
Oke, apakah ini saja yang valid? curl http://www.google.com 2>/dev/nullBagaimana baris perintah tahu bahwa "2" di sini dimaksudkan untuk berarti stderr dan sebenarnya bukan parameter kedua yang saya sampaikan ke perintah curl?
Matt Huggins
1
@Matt Huggins: Ya. Itu akan mengirim semua output dari stderrlangsung ke /dev/nullgantinya. Anda dapat melihatnya dalam praktek dengan mencoba curl, curl 1>/dev/nulldan curl 2>/dev/nullhanya untuk melihat perubahan output. Sekali lagi ampersand hanya diperlukan untuk deskriptor file yang dialihkan ke.
Chealion
23

tl; dr

Ambil http://www.google.comdi latar belakang dan buang kedua stdoutdan stderr.

curl http://www.google.com > /dev/null 2>&1 &

sama dengan

curl http://www.google.com > /dev/null 2>/dev/null &

Dasar-dasar

0, 1dan 2mewakili 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. curlakan mengambil apa pun yang ada di url yang ditentukan ( google dot com ) dan menampilkan hasilnya stdout.

hasil keriting

Pengalihan

Seperti yang Anda katakan <dan >digunakan untuk mengarahkan output dari perintah ke tempat lain, seperti file.

Sebagai contoh, in ls > myfiles.txt, lsmendapatkan 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.txtuntuk menampilkan konten file ke layar.

> / dev / null 2> & 1

Bagian pertama > /dev/nullmengarahkan ulang stdout, yaitu curloutput ke /dev/null(lebih lanjut tentang ini di depan) dan 2>&1mengarahkan kembali stderrke stdout(yang baru saja diarahkan ke /dev/nullsehingga semuanya akan dikirim ke /dev/null).

Sisi kiri 2>&1memberi 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 1atau 2. Jadi, 2>1akhirnya akan membuat file baru (jika belum ada) bernama 1dan buang stderrhasilnya di sana.

/ dev / null

/dev/nulladalah file kosong, mekanisme yang digunakan untuk membuang semua yang ditulis padanya. Jadi, curl http://www.google.com > /dev/nullsecara efektif menekan curloutput.

> / dev / null

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>&1mengabaikan curlkeluaran dan curlinformasi 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 ini jobsdi terminal Anda. Perhatikan ini berbeda dari proses yang berjalan di sistem Anda. Untuk melihat jenis itu topdi terminal.

Referensi

Jorge Bucaran
sumber
1
Ini adalah salah satu jawaban terbaik di seluruh situs web dari perspektif tata letak, bagus sekali!
OmarOthman
Satu hal yang tidak saya mengerti adalah mengapa Anda ingin mengirim semuanya /dev/null? Tidakkah Anda ingin hasil dari curlsetidaknya suatu tempat berguna?
skube
@skube Benar. Dalam hal ini tidak jelas bagi saya mengapa pengguna ingin membuang stdout dan stderr. OP mungkin hanya ingin mengerti apa arti sintaksis.
Jorge Bucaran
5

2mengacu pada STDERR. 2>&1akan mengirim STDERR ke lokasi yang sama dengan 1(STDOUT).

John T
sumber
0

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 > logfile2> & 1

YaOzI
sumber