Gibt es ein Standard-Bash-Tool, das sich wie ein Echo verhält, aber eher an stderr als an stdout ausgibt?
Ich weiß, dass ich das kann, echo foo 1>&2
aber es ist ein bisschen hässlich und, wie ich vermute, fehleranfällig (z. B. wird es eher falsch bearbeitet, wenn sich etwas ändert).
Antworten:
Sie könnten dies tun, was das Lesen erleichtert:
>&2
kopiert den Dateideskriptor Nr. 2 in den Dateideskriptor Nr. 1. Nachdem diese Umleitung durchgeführt wurde, beziehen sich beide Dateideskriptoren auf dieselbe Datei: Der eine Dateideskriptor Nr. 2 bezog sich ursprünglich auf dieselbe . Weitere Informationen finden Sie im Bash Hackers Illustrated Redirection Tutorial .quelle
alias
in einem Shell-Skript verwenden soll. Es wäre wahrscheinlich sicherer zu verwendenerrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
wird nicht funktionieren. Um so etwas zu tun, müssen Sie die Weiterleitung irgendwo nach der letzten Pipe platzieren, wie:errcho(){ echo $@|>&2 pr -To5;}
Sie können eine Funktion definieren:
Dies wäre schneller als ein Skript und hätte keine Abhängigkeiten.
Camilo Martins bash-spezifischer Vorschlag verwendet eine "Hier-Zeichenfolge" und druckt alles, was Sie an ihn übergeben, einschließlich der Argumente (-n), die das Echo normalerweise verschlucken würde:
Die Lösung von Glenn Jackman vermeidet auch das Problem des Schluckens von Argumenten:
quelle
echoerr -ne xt
wird nicht "-ne xt" drucken. Besser dafür nutzenprintf
.echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
Leerzeichen getrennt ist, als separates Argument gesendet, was im Fall vonecho
Verkettung mit0x20
s bedeutet, aber die Gefahren, nicht weit zu zitieren, übersteigen die Bequemlichkeit von 2 Zeichen weniger) .Da
1
es sich um die Standardausgabe handelt, müssen Sie diese nicht explizit vor einer Ausgabeumleitung wie benennen>
sondern können einfach Folgendes eingeben:Da Sie sich Sorgen zu machen scheinen, dass
1>&2
es für Sie schwierig sein wird, zuverlässig zu tippen, könnte die Beseitigung der Redundanz1
eine leichte Ermutigung für Sie sein!quelle
Andere Option
quelle
foo
- einen eigenen stderr umgeleitet hat - z. B.foo >foo.log 2>&1
-,echo foo >/dev/stderr
wird die gesamte Ausgabe davor blockiert.>>
sollte stattdessen verwendet werden:echo foo >>/dev/stderr
/dev/fd/2
./proc/self/fd/2
. Siehe meine Antwort unten :)Nein, das ist die Standardmethode. Es sollte keine Fehler verursachen.
quelle
1>&2
. Wir alle wünschen uns, dass dies nicht passieren würde, aber ich bin sicher, wir waren alle Orte, an denen dies der Fall ist.( echo something 1>&2 ; something else ) > log
->(echo something; cp some junk 1>&2 ; something else) > log
Ups.Wenn es Ihnen nichts ausmacht, die Nachricht auch in syslog zu protokollieren, lautet der not_so_ugly-Weg:
Die Option -s bedeutet: "Ausgabe der Nachricht an Standardfehler sowie an das Systemprotokoll."
quelle
Dies ist eine einfache STDERR-Funktion, die den Pipe-Eingang zu STDERR umleitet.
quelle
echo what | /dev/stderr
Hinweis: Ich beantworte die Frage nach dem Post- und nicht dem irreführenden / vagen "Echo, das an stderr ausgegeben wird" (bereits von OP beantwortet).
Verwenden Sie eine Funktion, um die Absicht anzuzeigen und die gewünschte Implementierung zu erstellen. Z.B
Und
error_handling
sein:Gründe, die Bedenken in OP behandeln:
Andere Gründe:
quelle
Mein Vorschlag:
oder
echo "my errz" > /proc/self/fd/2
effektiv ausgegeben wird ,stderr
weil/proc/self
ein Link zu dem aktuellen Prozess, und/proc/self/fd
hält den Prozess Filedeskriptoren geöffnet, und dann0
,1
und2
stehen fürstdin
,stdout
undstderr
jeweils.Der
/proc/self
Link funktioniert unter MacOS nicht, ist jedoch/proc/self/fd/*
unter Termux unter Android verfügbar, jedoch nicht/dev/stderr
. Wie erkenne ich das Betriebssystem anhand eines Bash-Skripts? kann helfen, wenn Sie Ihr Skript portabler machen müssen, indem Sie bestimmen, welche Variante verwendet werden soll.quelle
/proc/self
Link funktioniert unter MacOS nicht, daher bleibe ich bei der einfacheren/dev/stderr
Methode. Wie in anderen Antworten / Kommentaren erwähnt, ist es wahrscheinlich besser,>>
das Anhängen zu verwenden./proc/self/fd/*
ist unter Termux unter Android verfügbar, aber nicht/dev/stderr
.Nicht verwenden,
cat
da einige hier erwähnt werden.cat
ist ein Programm währendecho
undprintf
sind Bash (Shell) Builtins. Programm starten oder ein anderes Skript (ebenfalls oben erwähnt) starten, müssen Sie einen neuen Prozess mit allen Kosten erstellen. Mit eingebauten Funktionen sind Schreibfunktionen recht billig, da kein Prozess (-Umgebung) erstellt (ausgeführt) werden muss.Der Opner fragt "Gibt es ein Standardwerkzeug für die Ausgabe ( Pipe ) an stderr?". Die kurze Antwort lautet: NEIN ... warum? ... das Umleiten von Pipes ist ein grundlegendes Konzept in Systemen wie Unix (Linux ...) und bash (sh), das auf diesen Konzepten aufbaut.
Ich stimme dem Opener zu, dass das Umleiten mit solchen Notationen
&2>1
für moderne Programmierer nicht sehr angenehm ist, aber das ist Bash. Bash sollte keine riesigen und robusten Programme schreiben, sondern den Administratoren helfen, mit weniger Tastendruck dorthin zu gelangen ;-)Und zumindest können Sie die Umleitung an einer beliebigen Stelle in der Zeile platzieren:
quelle
cat
und der Anweisung, keine Katze zu verwenden, da diese langsam ist. Es gibt unzählige Anwendungsfälle, in denen Katze die richtige Wahl ist. Deshalb lehne ich Ihre Antwort ab.echo
Ersatz. Selbst wenn er verwendetcat
, muss er eine Bash-Weiterleitung verwenden. wie auch immer. Es macht also absolut keinen Sinn,cat
hier zu verwenden . Übrigens benutze ichcat
100 Mal am Tag, aber nie in dem Kontext, nach dem der Opener gefragt hat ... hast du es verstanden?Eine andere Option, über die ich kürzlich gestolpert bin, ist folgende:
Dies verwendet nur integrierte Bash-Funktionen, während die Ausgabe von mehrzeiligen Fehlern weniger fehleranfällig ist (da Sie nicht daran denken müssen
&>2
, jeder Zeile etwas hinzuzufügen ).quelle
cat
kein anderes Dienstprogramm zu verwenden, das für die Frage nicht zum Thema gehört.read
ist ein in die Shell integrierter Befehl, der auf stderr gedruckt wird und wie Echo verwendet werden kann, ohne Umleitungstricks auszuführen:Das
-t 0.1
ist ein Timeout deaktiviert Hauptfunktionalität zu lesen, eine Zeile von stdin in eine Variable speichern.quelle
Mach ein Skript
das wäre dein Werkzeug.
Oder erstellen Sie eine Funktion, wenn Sie kein Skript in einer separaten Datei haben möchten.
quelle
Mac OS X: Ich habe die akzeptierte Antwort und einige andere Antworten ausprobiert und alle haben dazu geführt, dass STDOUT nicht STDERR auf meinem Mac geschrieben wurde.
Hier ist eine tragbare Möglichkeit, mit Perl auf Standardfehler zu schreiben:
quelle