Saya tahu bahwa >tanda digunakan untuk pengalihan output di baris perintah, tapi saya mengalami kesulitan menemukan sesuatu yang menjelaskan penggunaan 2>&1di 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>&1di baris perintah. Sebagai contoh:
curl http://www.google.com > /dev/null 2>&1 &
Jawaban:
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.
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/nullBagaimana baris perintah tahu bahwa "2" di sini dimaksudkan untuk berarti stderr dan sebenarnya bukan parameter kedua yang saya sampaikan ke perintah curl?
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.
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 &
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.

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.
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/nulladalah file kosong, mekanisme yang digunakan untuk membuang semua yang ditulis padanya. Jadi,
curl http://www.google.com > /dev/nullsecara efektif menekan curloutput.

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.
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.
/dev/null? Tidakkah Anda ingin hasil dari curlsetidaknya 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 > logfile2> & 1