Apa maksud & tepatnya dalam redirection output?

19

Saya melihat hal-hal suka command 1> outatau dengan 2>&1untuk mengarahkan stderr, tetapi kadang-kadang saya juga melihat &>sendiri, dll.

Apa cara terbaik untuk memahami &dan apa artinya sebenarnya?

AJJ
sumber

Jawaban:

26

The &dalam 2>&1hanya mengatakan bahwa jumlahnya 1adalah file descriptor dan bukan nama file. Dalam hal ini standard output file descriptor.

Jika Anda menggunakan 2>1, maka ini akan mengarahkan kesalahan ke file bernama 1tetapi jika Anda menggunakan 2>&1, maka itu akan mengirimnya ke standard output stream.

Ini &>mengatakan kirim keduanya, standard outputdan standard error, ke suatu tempat. Misalnya ls <non-existent_file> &> out.file,. Biarkan saya menggambarkan ini dengan sebuah contoh.

Mempersiapkan:

  1. Buat file kokodengan konten berikut:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. Jadikan itu dapat dieksekusi: chmod u+x koko

  3. Sekarang perhatikan bahwa j1tidak ada

  4. Sekarang jalankan ./koko &> output

  5. jalankan cat outputdan Anda akan melihat

    ls: cannot access 'j1': No such file or directory
    koko2
    

Baik, standard error( ls: cannot access 'j1': No such file or directory) dan standard output( koko2), dikirim ke file output.

Sekarang jalankan lagi tapi kali ini seperti ini:

./koko > output

Lakukan cat outputdan Anda hanya akan melihat koko2sejenisnya. Tetapi bukan output kesalahan dari ls j1perintah. Itu akan dikirim ke standard errormana Anda akan melihat di terminal Anda.

Catatan penting terima kasih kepada @Byte Commander:

Perhatikan bahwa command >file 2>&1urutan pengalihan penting. Jika Anda menulis command 2>&1 >filesebaliknya (yang biasanya bukan yang Anda inginkan), pertama-tama ia akan mengarahkan perintah stdoutke file dan setelah itu mengarahkan perintah stderrke yang sekarang tidak digunakan stdout, sehingga akan muncul di terminal dan Anda dapat mengirim atau mengarahkannya lagi, tetapi tidak akan ditulis ke file.

George Udosen
sumber
2
Apa &>artinya?
AJJ
1
Perhatikan bahwa command >file 2>&1urutan pengalihan penting. Jika Anda menulis command 2>&1 >filesebaliknya (yang biasanya bukan yang Anda inginkan), pertama-tama ia akan mengarahkan stdout perintah ke file dan setelah itu mengarahkan stderr perintah ke stdout yang sekarang tidak digunakan, sehingga itu akan muncul di terminal dan Anda dapat memipangnya atau redirect lagi, tetapi tidak akan ditulis ke file.
Byte Commander
2
"Itu akan dikirim ke tempat standard outputyang akan kamu lihat di terminalmu." bukankah ini seharusnya menjadi "ke standard error"?
frarugi87
1
Ya @ frarugi87 hak Anda dikoreksi
George Udosen
1
@ George wow, kau cepat;) Kerja bagus
frarugi87
5

> FILE 2>&1dan &> FILEsetara. Lihat 8.2.3.2. Pengalihan kesalahan dalam Panduan Bash untuk Pemula Bab 8

J. Starnes
sumber
2
IIRC &> FILEhanya khusus untuk Bash sedangkan >FILE 2>&1dipahami oleh sejumlah besar shell.
Byte Commander
@ByteCommander, ohh, saya bahkan tidak tahu bash memiliki tulisan cepat ... Saya selalu menggunakan 2> & 1.
psusi
1

Ini [n]>&worddisebut Duplicating Output File Descriptor (lihat bagian 2.7.6 dari POSIX Shell Language Standard). Perilaku tertentu ini adalah fitur dari bourne-seperti kerang, termasuk ksh, dashdan bash; sebenarnya, standar ini didasarkan pada shell Bourne dan ksh. Melihat ke tcsh dan csh manual, mereka tampaknya tidak memberikan kemampuan menduplikasi file descriptor, namun dari deskripsi >&, berperilaku ini sebagai &>di bash(yaitu, pengalihan kesalahan dan output normal ke file).

Dalam sistem seperti * nix, termasuk Ubuntu, Anda sering mendengar bahwa semuanya adalah file, atau lebih tepatnya deskriptor file . Output standar adalah deskriptor file konstan 1 dan error standar adalah deskriptor file 2. Jadi, secara > FILE 2>&1teknis berarti duplikat file deskriptor 2 ke deskriptor file 1. Dengan kata lain dari jawaban ini :

2> & 1 memberi tahu shell untuk memberi perintah file deskriptor 2 yang merupakan duplikat deskriptor 1. (yaitu stderr & stdout menunjuk ke fd yang sama).

Kuncinya di sini adalah untuk mencatat bahwa deskriptor 1 harus ditetapkan terlebih dahulu. Karena shell memproses pengalihan dalam urutan kiri ke kanan, command >FILE 2>&1shell memberitahu untuk mengubah stdout untuk commandmasuk FILEterlebih dahulu, dan hanya kemudian deskriptor 2 dapat menjadi salinan 1, yaitu 1 dan 2 menunjuk ke lokasi yang sama - FILE.

Ini tentu saja melampaui kesalahan standar dan output standar. Seperti yang ditunjukkan dalam jawaban ini , dengan melakukan3&>2

... Anda menduplikasi (dup2) file 2 ke file 3, mungkin menutup file 3 jika sudah terbuka

Contoh memanipulasi deskriptor file, di antara banyak, akan menangkap output dari dialogperintah ke dalam variabel

Ini juga patut dicatat yang &>khusus untuk bash. Dalam zshhal ini berlaku sama, tetapi menurut dokumentasi, "... tidak memiliki efek yang sama dengan '> kata 2> & 1' di hadapan multios". Dalam memenuhi POSIX /bin/sh, ini akan diperlakukan sebagai pengalihan biasa dengan menempatkan perintah ke latar belakang. Lihat juga, Apakah ada kode sh yang kode bash tidak valid secara sintaksis? .

Lihat juga:

Sergiy Kolodyazhnyy
sumber