Pertanyaan echo yang menghasilkan stderr


Apakah ada alat Bash standar yang bertindak seperti gema tetapi output ke stderr daripada stdout?

Saya tahu saya bisa melakukannya echo foo 1>&2 tapi itu agak jelek dan, saya kira, rawan kesalahan (mis. lebih mungkin untuk diedit dengan salah ketika ada perubahan).


785
2018-06-07 14:36


asal


Jawaban:


Pertanyaan ini sudah tua, tetapi Anda bisa melakukan ini, yang memfasilitasi pembacaan:

>&2 echo "error"

Operator >&2 secara harfiah berarti mengarahkan alamat deskriptor file 1 (stdout) ke alamat file descriptor 2 (stderr) untuk perintah itu1. Tergantung seberapa dalam Anda ingin memahaminya, baca ini: http://wiki.bash-hackers.org/howto/redirection_tutorial

Untuk menghindari interaksi dengan pengalihan lain, gunakan subkulit

(>&2 echo "error")

1>&2 copy file descriptor # 2 ke file descriptor # 1. Oleh karena itu, setelah pengalihan ini dilakukan, kedua deskriptor file akan merujuk ke file yang sama: satu file deskriptor # 2 adalah semula mengacu.


977
2018-05-08 18:59



Anda bisa mendefinisikan fungsi:

echoerr() { echo "$@" 1>&2; }
echoerr hello world

Ini akan lebih cepat daripada skrip dan tidak memiliki ketergantungan.

Saran khusus camilo Martin menggunakan "string di sini" dan akan mencetak apa pun yang Anda berikan, termasuk argumen (-n) bahwa gema biasanya akan menelan:

echoerr() { cat <<< "$@" 1>&2; }

Solusi Glenn Jackman juga menghindari masalah argumen menelan:

echoerr() { printf "%s\n" "$*" >&2; }

355
2018-06-07 14:52



Sejak 1 adalah output standar, Anda tidak harus secara eksplisit menamakannya di depan output redirection seperti > tetapi bisa langsung mengetik:

echo Pesan ini pergi ke stderr> & 2

Karena kamu tampaknya khawatir itu 1>&2 akan sulit bagi Anda untuk mengetik dengan andal, penghapusan yang berlebihan 1 mungkin sedikit memberi semangat kepada Anda!


202
2017-07-10 21:24



Pilihan lain

echo foo >>/dev/stderr

39
2018-01-16 03:57



Tidak, itulah cara standar untuk melakukannya. Seharusnya tidak menyebabkan kesalahan.


29
2018-06-07 14:37



Ini adalah fungsi STDERR sederhana, yang mengarahkan input pipa ke STDERR.

#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {

cat - 1>&2

}

# remove the directory /bubu
if rm /bubu 2>/dev/null; then
    echo "Bubu is gone."
else
    echo "Has anyone seen Bubu?" | STDERR
fi


# run the bubu.sh and redirect you output
tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err

12
2018-02-03 08:40



Jika Anda tidak keberatan mencatat pesan juga ke syslog, cara not_so_ugly adalah:

logger -s $msg

Opsi -s berarti: "Output pesan ke kesalahan standar serta ke log sistem."


9
2017-08-04 19:15