Ketika Anda ingin mengarahkan stdout dan stderr ke file yang sama, Anda dapat melakukannya dengan menggunakan command 1>file.txt 2>&1
, atau command &>file.txt
. Tetapi mengapa perilaku command 1>file.txt 2>file.txt
berbeda dari dua perintah di atas?
Berikut ini adalah perintah verifikasi.
$ cat redirect.sh
#!/bin/bash
{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file.txt 2>&1
{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file1.txt 2>file1.txt
{ echo -e "error" 1>&2 && echo -e "output\noutput"; } 1>file2.txt 2>file2.txt
{ echo -e "output" && echo -e "error\nerror" 1>&2; } 1>file3.txt 2>file3.txt
{ echo -e "error\nerror" 1>&2 && echo -e "output"; } 1>file4.txt 2>file4.txt
$ ./redirect.sh
$ echo "---file.txt---"; cat file.txt;\
echo "---file1.txt---"; cat file1.txt; \
echo "---file2.txt---"; cat file2.txt; \
echo "---file3.txt---"; cat file3.txt; \
echo "---file4.txt----"; cat file4.txt;
---file.txt---
output
output
error
---file1.txt---
error
output
---file2.txt---
output
output
---file3.txt---
error
error
---file4.txt----
output
rror
Sejauh hasilnya terlihat, sepertinya string gema kedua menimpa gema string pertama ketika Anda menjalankan command 1>file.txt 2>file.txt
, tapi saya tidak tahu mengapa itu akan terjadi. (Apakah ada referensi di suatu tempat?)
bash
shell
io-redirection
echo
fhiyo
sumber
sumber
Menggunakan
>
memberitahu untuk menimpa file. Karena Anda memiliki stdout dan stderr menulis ke file dalam dua operasi yang berbeda, yang terakhir untuk menulis akan menimpa yang pertama.Anda dapat melakukan:
command 1>>file.txt 2>>file.txt
atau
command &>file.txt
Hanya bash v4 ke atas.>>
memerintahkannya untuk menambahkan file sehingga tidak akan menggantikan output operasi sebelumnya.&>
hanyalah cara yang lebih mudah untuk menulis2>&1
sumber
ls 1>&0
danls 0>&0
masih menampilkan output ls?>>
karya. Mengapa ini tidak memiliki masalah dua deskripsi file dengan offset independen? @ JdeBP, tahukah Anda? Saya berpikir bahwa membuka file dalam mode append sama dengan membuka dalam mode tulis, mencari ke posisi akhir, kemudian menolak mencari lebih lanjut.O_APPEND
.