Apakah ada alat Bash standar yang bertindak seperti gema tetapi output ke stderr daripada stdout?
Saya tahu saya bisa melakukan echo foo 1>&2
tetapi itu agak jelek dan, saya curiga, rawan kesalahan (misalnya lebih mungkin salah diedit ketika ada perubahan).
Jawaban:
Anda bisa melakukan ini, yang memudahkan membaca:
>&2
menyalin file deskriptor # 2 ke file deskriptor # 1. Oleh karena itu, setelah pengalihan ini dilakukan, kedua deskriptor file akan merujuk ke file yang sama: deskriptor satu file # 2 pada awalnya merujuk. Untuk informasi lebih lanjut, lihat Tutorial Pengalihan Illustrated Bash Hacker .sumber
alias
skrip shell. Mungkin akan lebih aman untuk digunakanerrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
tidak akan berfungsi. Untuk melakukan sesuatu seperti itu Anda harus meletakkan redirect di suatu tempat setelah pipa terakhir seperti:errcho(){ echo $@|>&2 pr -To5;}
Anda dapat mendefinisikan suatu fungsi:
Ini akan lebih cepat daripada skrip dan tidak memiliki dependensi.
Saran khusus bash Camilo Martin menggunakan "string di sini" dan akan mencetak apa pun yang Anda berikan padanya, termasuk argumen (-n) yang biasanya ditelan gema:
Solusi Glenn Jackman juga menghindari argumen menelan masalah:
sumber
echoerr -ne xt
tidak akan mencetak "-ne xt". Lebih baik gunakanprintf
untuk itu.echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
spasi putih dikirim sebagai argumen terpisah, yang dalam halecho
cara menggabungkan mereka dengan0x20
s, tetapi bahaya tidak mengutip jauh melebihi kenyamanan 2 karakter untuk mengetik) .Karena
1
ini adalah output standar, Anda tidak perlu menyebutkannya secara eksplisit di depan pengalihan output seperti>
tetapi cukup mengetik:Karena Anda tampaknya khawatir bahwa
1>&2
akan sulit bagi Anda untuk mengetik dengan andal, penghapusan yang berlebihan1
mungkin sedikit menyemangati Anda!sumber
Pilihan lain
sumber
foo
- memiliki stderrnya sendiri yang dialihkan - mis.foo >foo.log 2>&1
- makaecho foo >/dev/stderr
akan merusak semua output sebelumnya.>>
harus digunakan sebagai gantinya:echo foo >>/dev/stderr
/dev/fd/2
./proc/self/fd/2
. Lihat jawaban saya di bawah ini :)Tidak, itu cara standar untuk melakukannya. Seharusnya tidak menyebabkan kesalahan.
sumber
1>&2
. Kita semua berharap ini tidak akan terjadi, tetapi saya yakin kita semua pernah menjadi tempat di mana itu terjadi.( echo something 1>&2 ; something else ) > log
->(echo something; cp some junk 1>&2 ; something else) > log
Ups.Jika Anda tidak keberatan mencatat pesan juga ke syslog, cara not_so_ugly adalah:
Opsi -s berarti: "Keluarkan pesan ke kesalahan standar dan juga ke log sistem."
sumber
Ini adalah fungsi STDERR sederhana, yang mengarahkan input pipa ke STDERR.
sumber
echo what | /dev/stderr
Catatan: Saya menjawab pertanyaan post-bukan pertanyaan "gema yang keluar ke stderr" yang menyesatkan / tidak jelas (sudah dijawab oleh OP).
Gunakan fungsi untuk menunjukkan maksud dan sumber implementasi yang Anda inginkan. Misalnya
Dan
error_handling
menjadi:Alasan yang menangani masalah dalam OP:
Alasan lain:
sumber
Saran saya:
atau
echo "my errz" > /proc/self/fd/2
akan efektif output kestderr
karena/proc/self
ini adalah link ke proses saat ini, dan/proc/self/fd
memegang proses membuka deskriptor file, dan kemudian,0
,1
, dan2
berdiri untukstdin
,stdout
danstderr
masing-masing.The
/proc/self
link tidak bekerja pada MacOS, bagaimanapun,/proc/self/fd/*
tersedia di Termux di Android, tapi tidak/dev/stderr
. Bagaimana cara mendeteksi OS dari skrip Bash? dapat membantu jika Anda perlu membuat skrip Anda lebih portabel dengan menentukan varian mana yang akan digunakan.sumber
/proc/self
Link tidak bekerja pada MacOS, jadi saya akan tetap dengan lebih lurus ke depan/dev/stderr
metode. Juga, seperti disebutkan dalam jawaban / komentar lain, mungkin lebih baik digunakan>>
untuk menambahkan./proc/self/fd/*
tersedia di Termux di Android, tetapi tidak/dev/stderr
.Jangan gunakan
cat
karena beberapa disebutkan di sini.cat
adalah program sementaraecho
danprintf
merupakan bash (shell) bawaan. Meluncurkan program atau skrip lain (juga disebutkan di atas) berarti membuat proses baru dengan semua biayanya. Menggunakan builtin, fungsi penulisan cukup murah, karena tidak perlu membuat (mengeksekusi) suatu proses (-environment).Opner bertanya "apakah ada alat standar untuk keluaran ( pipa ) ke stderr", jawabannya adalah: TIDAK ... mengapa? ... pipa rediredcting adalah konsep elemantari dalam sistem seperti unix (Linux ...) dan bash (sh) dibangun di atas konsep-konsep ini.
Saya setuju dengan pembuka yang mengarahkan ulang dengan notasi seperti ini:
&2>1
tidak terlalu menyenangkan untuk programmer modern, tapi itu bash. Bash tidak dimaksudkan untuk menulis program yang besar dan tangguh, ini dimaksudkan untuk membantu para admin agar bisa bekerja di sana dengan penekanan tombol yang lebih sedikit ;-)Dan setidaknya, Anda dapat menempatkan pengalihan di mana saja di baris:
sumber
cat
dan menginstruksikan seseorang untuk tidak menggunakan kucing karena lambat. Ada banyak kasus penggunaan di mana kucing adalah pilihan yang tepat, jadi itu sebabnya saya keberatan dengan jawaban Anda.echo
pengganti. Bahkan jika dia menggunakancat
, dia harus menggunakan pengalihan bash. bagaimanapun. Jadi, sama sekali tidak masuk akal untuk digunakan dicat
sini. BTW saya menggunakancat
100 kali sehari, tetapi tidak pernah dalam konteks pembuka meminta ... Anda mendapatkannya?Opsi lain yang baru-baru ini saya temukan adalah:
Ini hanya menggunakan Bash built-in sambil membuat output kesalahan multi-baris lebih sedikit kesalahan (karena Anda tidak harus ingat untuk menambahkan
&>2
ke setiap baris).sumber
cat
atau utilitas lain, yang di luar topik untuk pertanyaan itu.read
adalah perintah shell builtin yang mencetak ke stderr, dan dapat digunakan seperti gema tanpa melakukan trik pengalihan:Ini
-t 0.1
adalah batas waktu yang menonaktifkan fungsi utama baca, menyimpan satu baris stdin ke dalam variabel.sumber
Buat skrip
itu akan menjadi alat Anda.
Atau buat fungsi jika Anda tidak ingin memiliki skrip dalam file terpisah.
sumber
Menggabungkan solusi yang disarankan oleh James Roth dan Glenn Jackman
sumber
Mac OS X: Saya mencoba jawaban yang diterima dan beberapa jawaban lainnya dan semuanya menghasilkan penulisan STDOUT bukan STDERR pada Mac saya.
Berikut ini adalah cara portabel untuk menulis ke kesalahan standar menggunakan Perl:
sumber