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

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.