Jawaban:
The &
dalam 2>&1
hanya mengatakan bahwa jumlahnya 1
adalah 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 1
tetapi jika Anda menggunakan 2>&1
, maka itu akan mengirimnya ke standard output stream
.
Ini &>
mengatakan kirim keduanya, standard output
dan standard error
, ke suatu tempat. Misalnya ls <non-existent_file> &> out.file
,. Biarkan saya menggambarkan ini dengan sebuah contoh.
Mempersiapkan:
Buat file koko
dengan konten berikut:
#!bin/bash
ls j1
echo "koko2"
Jadikan itu dapat dieksekusi: chmod u+x koko
Sekarang perhatikan bahwa j1
tidak ada
Sekarang jalankan ./koko &> output
jalankan cat output
dan 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 output
dan Anda hanya akan melihat koko2
sejenisnya. Tetapi bukan output kesalahan dari ls j1
perintah. Itu akan dikirim ke standard error
mana Anda akan melihat di terminal Anda.
Catatan penting terima kasih kepada @Byte Commander:
Perhatikan bahwa command >file 2>&1
urutan pengalihan penting. Jika Anda menulis command 2>&1 >file
sebaliknya (yang biasanya bukan yang Anda inginkan), pertama-tama ia akan mengarahkan perintah stdout
ke file dan setelah itu mengarahkan perintah stderr
ke yang sekarang tidak digunakan stdout
, sehingga akan muncul di terminal dan Anda dapat mengirim atau mengarahkannya lagi, tetapi tidak akan ditulis ke file.
command >file 2>&1
urutan pengalihan penting. Jika Anda menulis command 2>&1 >file
sebaliknya (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.
standard output
yang akan kamu lihat di terminalmu." bukankah ini seharusnya menjadi "ke standard error
"?
> FILE 2>&1
dan &> FILE
setara. Lihat 8.2.3.2. Pengalihan kesalahan dalam Panduan Bash untuk Pemula Bab 8
&> FILE
hanya khusus untuk Bash sedangkan >FILE 2>&1
dipahami oleh sejumlah besar shell.
Ini [n]>&word
disebut 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
, dash
dan 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>&1
teknis 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>&1
shell memberitahu untuk mengubah stdout untuk command
masuk FILE
terlebih 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 dialog
perintah ke dalam variabel
Ini juga patut dicatat yang &>
khusus untuk bash
. Dalam zsh
hal 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:
&>
artinya?