Ich versuche, stderr nach stdout und dann in eine Datei in einem Init-Skript umzuleiten, aber wenn ich stderr in stdout einführe, erhalte ich Der Fehler „Mehrdeutige Ausgabeumleitung“. Stdout allein führt nicht zu dem Fehler und schreibt in die Protokolldatei, in der ich angegeben habe. Ich habe Folgendes versucht:
-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log & -jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 &
Jeder Rat wäre willkommen.
Kommentare
- Ratschläge: (1) Geben Sie keine Beispielbefehle an, die 100 Zeichen lang, wenn Sie nicht müssen. Sie können das Problem mit
echo &> foo
demonstrieren. (2) Geben Sie keine asynchronen Beispielbefehle an, wenn Sie dies nicht müssen. (3) Erfahren Sie mehr über Muscheln. In Unixverse gibt es mehr als eine Shell, die unterschiedliche Befehlssyntaxen akzeptiert. Erfahren Sie, wie Sie feststellen, welche Shell Sie verwenden. - Mögliches Duplikat der stderr-Umleitung, die in csh nicht funktioniert
- Siehe auch Inkonsistenz der stderr-Umleitung zwischen tcsh und anderen Shells , Was sind die Steuerungs- und Umleitungsoperatoren der Shell? , Unterschied zwischen 2 > & -, 2 > / dev / null, | &, & > / dev / null und > / dev / null 2 > & 1 und Umleitungsunterschiede zwischen & > > & und 2 > & 1 .
- Welche Shell verwenden Sie?
- Entschuldigung, sollte dies notiert haben ist in Bash
Antwort
Wenn Sie (t) csh ausführen, erhalten Sie Ambiguous output redirect.
Wenn Sie versuchen, zwei widersprüchliche Umleitungen einzurichten:
> echo foo > a > b Ambiguous output redirect.
In Bash kann bei Verwendung eines Arrays ein ähnlicher Fehler auftreten mit mehreren Elementen anstelle des Dateinamens:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Wie in den Antworten auf angegeben, funktioniert die stderr-Umleitung nicht csh arbeitet der Operator >&
in (t) csh, um sowohl stdout als auch stderr umzuleiten. 2>&1
ist die Standardmethode, um stderr an dieselbe Stelle wie stdout umzuleiten, aber (t) csh unterstützt dies nicht. Stattdessen wird die Kombination als Umleitung zu foo
, als reguläres Argument 2
und als Umleitung zu 1
und der Umleitungskonflikt, sodass Sie den Fehler erhalten.
>&
funktioniert auch in Bash und zsh, ist jedoch keine Standardfunktion.
Antwort
Der zweite Eintrag sollte einwandfrei funktionieren. Der Fehler „Mehrdeutige Umleitung“ tritt manchmal auf, wenn Sie entweder Leerzeichen haben, wo sie nicht sein sollten, oder umgekehrt, wenn ein wichtiges Leerzeichen fehlt.
Ich würde Ihren Befehl vereinfachen, um Folgendes zu demonstrieren:
echo "Test" >/tmp/x.txt 2>&1 &
Der Teil „> /tmp/x.txt“ leitet stdout um (Dateihandle Nr. 1). Ein Leerzeichen zwischen> und dem Dateinamen ist zulässig (obwohl in diesem Zusammenhang) wäre verwirrend), aber ansonsten sollte hier kein Leerzeichen stehen.
Die 2> & 1 leitet stderr (Dateihandle 2) in eine beliebige Datei um Handle 1 geht zu (was stdout ist). Auch hier dürfen keine Leerzeichen vorhanden sein.
Die & wird Ihre Aufgabe als Hintergrund verwenden. Dies muss versetzt sein mit einem Leerzeichen aus dem vorhergehenden Zeichen.
Das Umkehren der beiden Umleitungen funktioniert nicht (obwohl Echo hier eine schlechte Wahl ist, da es keine stderr-Ausgabe erzeugt):
echo "This will not work" 2>&1 >/tmp/x.txt &
Dies bedeutet:
2>&1
Leiten Sie das Dateihandle 2 nach um wohin das Dateihandle 1 geht (das zu diesem Zeitpunkt noch die Konsole ist)
>/tmp/x.txt
Leiten Sie das Dateihandle 1 in eine Datei um – aber seit dem Dateihandle 2 (stderr) Wird bereits zu diesem Zeitpunkt umgeleitet, behält es sein Ziel bei und wechselt weiterhin zur Konsole.
Der erste Befehl, den Sie geschrieben haben, ist einfach ein Syntaxfehler.
echo &>/tmp/x.txt
Update : @Wildcard wies in den Kommentaren darauf hin, dass dies tatsächlich eine gültige Syntax ist.
Kommentare
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Es kann den Raum enthalten.command >out.txt
==command > out.txt
- Sie haben Recht; Ich habe dort einen Fehler gemacht. Behebung.
- " Der erste Befehl, den Sie geschrieben haben, ist einfach ein Syntaxfehler. " Nein, es ' s nicht; ' ist die bevorzugte Bash-Syntax zum Umleiten von stdout und stderr. Siehe
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcard – danke. Ich höre nie auf zu lernen!