Frage Echo, das an stderr ausgibt


Gibt es ein Standard-Bash-Tool, das sich wie ein Echo verhält, aber statt stdout an stderr ausgibt?

Ich weiß, dass ich es kann echo foo 1>&2 aber es ist ein bisschen hässlich und, ich vermute, fehleranfällig (z. B. wahrscheinlicher, falsch bearbeitet zu werden, wenn sich die Dinge ändern).


785
2018-06-07 14:36


Ursprung


Antworten:


Diese Frage ist alt, aber Sie könnten dies tun, was das Lesen erleichtert:

>&2 echo "error"

Der Betreiber >&2 wörtlich bedeutet, die Adresse des Dateideskriptors 1 umzuleiten (stdout) an die Adresse des Datei-Deskriptors 2 (stderr) für diesen Befehl1. Je nachdem, wie tief Sie es verstehen wollen, lesen Sie dies: http://wiki.bash-hackers.org/howto/redirection_tutorial

Um eine Interaktion mit anderen Umleitungen zu vermeiden, verwenden Sie subshell

(>&2 echo "error")

1>&2 Kopiert den Dateideskriptor # 2 in den Dateideskriptor # 1. Nachdem diese Umleitung ausgeführt wurde, beziehen sich beide Dateideskriptoren daher auf dieselbe Datei: der eine Dateideskriptor # 2 war ursprünglich in Bezug auf.


977
2018-05-08 18:59



Sie könnten eine Funktion definieren:

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

Dies wäre schneller als ein Skript und hätte keine Abhängigkeiten.

Der bash-spezifische Vorschlag von Camilo Martin verwendet eine "here string" und gibt alles aus, was Sie ihm übergeben, einschließlich der Argumente (-n), die echo normalerweise verschlucken würde:

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

Glenn Jackmans Lösung vermeidet auch das Argument Schluckproblem:

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

355
2018-06-07 14:52



Schon seit 1 ist die Standardausgabe, Sie müssen sie nicht explizit vor einer Ausgabeumleitung wie z > aber stattdessen kann einfach eingeben:

echo Diese Nachricht wird an stderr> & 2 gesendet

Da scheinst du dir Sorgen zu machen 1>&2 wird es schwierig für Sie, die Beseitigung der redundanten zuverlässig zu tippen 1 könnte eine leichte Ermutigung für Sie sein!


202
2017-07-10 21:24



Andere Option

echo foo >>/dev/stderr

39
2018-01-16 03:57



Nein, das ist der Standardweg. Es sollte keine Fehler verursachen.


29
2018-06-07 14:37



Dies ist eine einfache STDERR-Funktion, die den Pipe-Eingang in STDERR umleitet.

#!/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



Wenn es Ihnen nichts ausmacht, die Nachricht auch in syslog zu protokollieren, ist der Weg von not_so_ugly:

logger -s $msg

Die Option -s bedeutet: "Geben Sie die Nachricht sowohl für den Standardfehler als auch für das Systemprotokoll aus."


9
2017-08-04 19:15