Di bash.
Saya mengalami kesulitan untuk menentukan apa yang harus saya gunakan?
semua skrip saya menggunakan ">> / dev / stderr"
di bash prompt, jika saya mencoba:
echo test >>/dev/stderr
works
echo test >> /dev/stderr
works
echo test >/dev/stderr
works
echo test > /dev/stderr
works
echo test >>&2
GAGAL!
echo test >> &2
GAGAL!
echo test >&2
bekerja
echo test > &2
GAGAL!
Saya bersedia mengubah semua skrip saya >&2
.
Tampaknya juga memiliki efek besar pada ssh (setelah su SomeUser
) di mana >>/dev/stderr
tidak akan berfungsi sama sekali (izin ditolak), hanya >&2
akan berfungsi.
bash
ssh
io-redirection
stderr
Aquarius Power
sumber
sumber
su
masalah itu terjadi, memperbarui pertanyaansu -c 'some command'
, perintah itu dijalankan oleh/bin/sh
, bukanbash
, jadi perilaku spesifik-bash (seperti simulasi/dev/stderr
untuk tujuan pengalihan bila tidak tersedia) tidak dijamin untuk hadir.Jawaban:
>& n
adalah sintaks shell untuk secara langsung menduplikasi file descriptor . Deskripsi file 2 adalah stderr; begitulah cara kerjanya. Anda dapat menduplikasi file deskriptor lain juga, bukan hanya stderr. Anda tidak dapat menggunakan mode append di sini karena menduplikasi deskriptor file tidak pernah terpotong (bahkan jika stderr Anda adalah file) dan>&
merupakan salah satu token, itu sebabnya Anda tidak dapat menempatkan spasi di dalamnya — tetapi>& 2
berfungsi.>> name
adalah sintaks yang diizinkan yang berbeda, di mananame
ada nama file (dan tokennya>>
). Dalam hal ini, Anda menggunakan nama file/dev/stderr
, yang oleh penanganan khusus OS (di Linux, itu symlink ke/proc/self/fd/2
) juga berarti kesalahan standar. Mode tambah dan terpotong keduanya berakhir melakukan hal yang sama ketika stderr adalah terminal karena itu tidak dapat terpotong. Namun, jika kesalahan standar Anda adalah file, itu akan dipotong:Jika Anda melihat kesalahan dengan
/dev/stderr
lebih dari ssh, mungkin admin server telah menerapkan beberapa tindakan keamanan yang mencegah symlink tersebut berfungsi. (Misalnya, Anda tidak dapat mengakses/proc
atau/dev
). Sementara saya berharap salah satu penyebab kerusakan aneh, menggunakan sintaks deskriptor file duplikat adalah pendekatan yang masuk akal (dan mungkin sedikit lebih efisien). Secara pribadi saya lebih suka itu.sumber
>>
, terima kasih untuk menunjukkan itu! Juga, saya melewatkan langkahsu SomeUser
setelah menghubungkan melalui ssh.bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foo
tidak akan memotong tho! (bahkan dengan2>&1 |tee /tmp/foo
) apa yang sempurna untuk penebangan, dan akan berfungsi dengan baik setelah saya ubah semuanya>&2
. Jadi saya kira hanya penggunaan file secara langsung yang/dev/stderr
memungkinkan truncating, bukan deskriptor yang diduplikasi, cool thx!Kasus kegagalan terjadi karena sintaks bash untuk digunakan
&
dalam pengalihan menentukan satu>
, dan mengharuskan itu ada berbatasan langsung dengan&
tanda:sumber
Gunakan
'>'
untuk mengalihkan (memotong jika ada) atau'>>'
(menambahkan jika ada).Gunakan
'>&'
untuk menduplikasi aliran, misalnya, jika Anda ingin output standar DAN kesalahan standar dalam file yang sama, Anda mengarahkan ulang ke file'> output.log'
dan juga kesalahan dengan'2>&'
sumber