Sie zeigen nicht alle. wo hast du bekommen ${OUPUT_RESULTS}. Es ist auch ein Rechtschreibfehler, wenn Sie gemeint haben$OUTPUT_RESULTS}
ghostdog74
Wenn man schreibt OUPUT_RESULTS = "filename.log", bekommt man eine mehrdeutige Weiterleitung. Weil bash KEINEN RAUM um den =Bediener will .
Poutrathor
Antworten:
269
Bash kann manchmal ziemlich stumpf sein.
Die folgenden Befehle geben alle unterschiedliche Fehlermeldungen für im Grunde denselben Fehler zurück:
$ echo hello >
bash: syntax error near unexpected token `newline`
$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect
$ echo hello >"${NONEXISTENT}"
bash::No such file or directory
Das Hinzufügen von Anführungszeichen um die Variable scheint ein guter Weg zu sein, um mit der Meldung "Mehrdeutige Umleitung" umzugehen: Sie erhalten tendenziell eine bessere Meldung, wenn Sie einen Tippfehler gemacht haben - und wenn der Fehler auf Leerzeichen im Dateinamen zurückzuführen ist. Die Verwendung von Anführungszeichen ist die Lösung.
Sie erhalten dies auch, wenn Sie die Ausgabe eines Skripts umleiten, das Weiterleitungen enthält. Frag mich nicht, woher ich das weiß.
Paul Jackson
@ PaulJackson, ... das stimmt nicht. Als kopierbarer und einfügbarer Demonstrator: Funktioniert sh -c 'echo hello >/tmp/hello' >/tmp/worldordnungsgemäß.
Charles Duffy
24
Haben Sie eine Variable mit dem Namen OUPUT_RESULTSoder ist dies wahrscheinlicher OUTPUT_RESULTS?
Wenn Ihr ABC="junk file.txt", hätte dies immer noch das Problem.
Charles Duffy
15
Setzen Sie Anführungszeichen um Ihre Variable. Wenn es Leerzeichen gibt, erhalten Sie auch eine "mehrdeutige Weiterleitung". Überprüfen Sie auch Ihre Rechtschreibung
Zitate spielen keine Rolle. Wenn die Variablenerweiterung Leerzeichen enthält, werden nur falsche Dateien und / oder falsche Fehlermeldungen angezeigt, die den Post-Space-Teil des Dateinamens betreffen.
Nur meine richtige Meinung
@JUSTMYcorrectOPINION, die Shell wird nach Parametererweiterungen nicht erneut analysiert - was bedeutet, dass Inhalte nach dem Leerzeichen innerhalb der Erweiterungsergebnisse nicht dazu führen können, dass eine andere Syntax ausgefüllt wird.
Charles Duffy
5
Ich habe kürzlich festgestellt, dass Leerzeichen im Namen der Umleitungsdatei die Meldung "Mehrdeutige Umleitung" verursachen.
Wenn Sie beispielsweise zu umleiten application$(date +%Y%m%d%k%M%S).logund die falschen Formatierungszeichen angeben, schlägt die Umleitung beispielsweise vor 10 Uhr fehl. Wenn Sie application$(date +%Y%m%d%H%M%S).loges jedoch verwenden würden, wäre es erfolgreich. Dies liegt daran, dass das %kFormat ' 9'für 9 Uhr morgens %Hergibt, '09'während es für 9 Uhr morgens ergibt .
Enthält der in $ {OUPUT_RESULTS} angegebene Pfad Leerzeichen? In diesem Fall sollten Sie die Verwendung ... >> "${OUPUT_RESULTS}"(in Anführungszeichen) in Betracht ziehen .
(Möglicherweise möchten Sie auch Ihre Variable in umbenennen. ${OUTPUT_RESULTS})
Ich hatte gerade diesen Fehler in einem Bash-Skript. Das Problem war ein versehentlicher Fehler am Ende der vorherigen Zeile, der einen Fehler verursachte.
Wenn die Umleitung Ihres Skripts eine Variable enthält und der Skriptkörper diese Variable in einem in Klammern eingeschlossenen Abschnitt definiert, wird der Fehler "Mehrdeutige Umleitung" angezeigt. Hier ist ein reproduzierbares Beispiel:
vim a.sh um das Skript zu erstellen
zu bearbeitendes Skript bearbeiten (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh um es ausführbar zu machen
a.sh
Wenn Sie dies tun, erhalten Sie "/home/ubuntu/a.sh: Zeile 1: $ logit: mehrdeutige Weiterleitung". Das ist weil
"Durch das Platzieren einer Liste von Befehlen in Klammern wird eine Unterschale erstellt und jeder der Befehle in der Liste in dieser Unterschale ausgeführt, ohne nicht exportierte Variablen zu entfernen. Da die Liste in einer Unterschale ausgeführt wird, bleiben die Variablenzuweisungen nicht erhalten in Kraft nach Abschluss der Unterschale. "
Um dies zu korrigieren, können Sie das Skript in Schritt 2 ändern, um die Variable außerhalb der Klammer zu definieren: logit="/home/ubuntu/test.log" && (echo "a") >> $logit
Wenn Sie im Shell-Befehl einen Variablennamen verwenden, müssen Sie ihn mit einem +Vorzeichen verketten .
zum Beispiel :
Wenn Sie zwei Dateien haben und den Dateinamen nicht fest codieren möchten, möchten Sie stattdessen den Variablennamen verwenden "input.txt" = x "output.txt" = y
dann ('Shell-Befehl in Anführungszeichen' + x> + y)
Dies funktioniert insbesondere dann, wenn Sie dies wahrscheinlich in einem Python-Programm mit dem Befehl os.system verwenden
Wenn Sie die Datei nicht in einer Variablen angegeben und die Ausgabe darauf umgeleitet haben, löst bash diesen Fehler aus.
files=`ls`
out_file =/path/to/output_file.t
for i in`echo "$files"`;do
content=`cat $i`
echo "${content} ${i}">> ${out_file}done
Die Variable out_file ist nicht korrekt eingerichtet. Behalten Sie dies ebenfalls im Auge. Übrigens druckt dieser Code den gesamten Inhalt und seinen Dateinamen auf der Konsole.
${OUPUT_RESULTS}
. Es ist auch ein Rechtschreibfehler, wenn Sie gemeint haben$OUTPUT_RESULTS}
OUPUT_RESULTS = "filename.log"
, bekommt man eine mehrdeutige Weiterleitung. Weil bash KEINEN RAUM um den=
Bediener will .Antworten:
Bash kann manchmal ziemlich stumpf sein.
Die folgenden Befehle geben alle unterschiedliche Fehlermeldungen für im Grunde denselben Fehler zurück:
Das Hinzufügen von Anführungszeichen um die Variable scheint ein guter Weg zu sein, um mit der Meldung "Mehrdeutige Umleitung" umzugehen: Sie erhalten tendenziell eine bessere Meldung, wenn Sie einen Tippfehler gemacht haben - und wenn der Fehler auf Leerzeichen im Dateinamen zurückzuführen ist. Die Verwendung von Anführungszeichen ist die Lösung.
quelle
sh -c 'echo hello >/tmp/hello' >/tmp/world
ordnungsgemäß.Haben Sie eine Variable mit dem Namen
OUPUT_RESULTS
oder ist dies wahrscheinlicherOUTPUT_RESULTS
?quelle
ABC="junk file.txt"
, hätte dies immer noch das Problem.Setzen Sie Anführungszeichen um Ihre Variable. Wenn es Leerzeichen gibt, erhalten Sie auch eine "mehrdeutige Weiterleitung". Überprüfen Sie auch Ihre Rechtschreibung
zB von mehrdeutiger Weiterleitung
quelle
Ich habe kürzlich festgestellt, dass Leerzeichen im Namen der Umleitungsdatei die Meldung "Mehrdeutige Umleitung" verursachen.
Wenn Sie beispielsweise zu umleiten
application$(date +%Y%m%d%k%M%S).log
und die falschen Formatierungszeichen angeben, schlägt die Umleitung beispielsweise vor 10 Uhr fehl. Wenn Sieapplication$(date +%Y%m%d%H%M%S).log
es jedoch verwenden würden, wäre es erfolgreich. Dies liegt daran, dass das%k
Format' 9'
für 9 Uhr morgens%H
ergibt,'09'
während es für 9 Uhr morgens ergibt .echo $(date +%Y%m%d%k%M%S)
gibt20140626 95138
echo $(date +%Y%m%d%H%M%S)
gibt20140626095138
Das fehlerhafte Datum könnte Folgendes ergeben:
wo das Folgende erwünscht wäre:
quelle
Enthält der in $ {OUPUT_RESULTS} angegebene Pfad Leerzeichen? In diesem Fall sollten Sie die Verwendung
... >> "${OUPUT_RESULTS}"
(in Anführungszeichen) in Betracht ziehen .(Möglicherweise möchten Sie auch Ihre Variable in umbenennen.
${OUTPUT_RESULTS}
)quelle
Ich hatte gerade diesen Fehler in einem Bash-Skript. Das Problem war ein versehentlicher Fehler am Ende der vorherigen Zeile, der einen Fehler verursachte.
quelle
Eine andere Sache, die eine "mehrdeutige Umleitung" verursachen kann, ist
\t
\n
\r
der Variablenname, den Sie ebenfalls schreibenVielleicht nicht
\n\r
? Aber seien Sie vorsichtigVersuche dies
Ich wurde mit diesem beim Parsen von HTML, Tabs
\t
am Anfang der Zeile getroffen.quelle
Wenn die Umleitung Ihres Skripts eine Variable enthält und der Skriptkörper diese Variable in einem in Klammern eingeschlossenen Abschnitt definiert, wird der Fehler "Mehrdeutige Umleitung" angezeigt. Hier ist ein reproduzierbares Beispiel:
vim a.sh
um das Skript zu erstellen(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
um es ausführbar zu machena.sh
Wenn Sie dies tun, erhalten Sie "/home/ubuntu/a.sh: Zeile 1: $ logit: mehrdeutige Weiterleitung". Das ist weil
Von Verwenden von Klammern zum Gruppieren und Erweitern von Ausdrücken
Um dies zu korrigieren, können Sie das Skript in Schritt 2 ändern, um die Variable außerhalb der Klammer zu definieren:
logit="/home/ubuntu/test.log" && (echo "a") >> $logit
quelle
Wenn Sie im Shell-Befehl einen Variablennamen verwenden, müssen Sie ihn mit einem
+
Vorzeichen verketten .zum Beispiel :
Wenn Sie zwei Dateien haben und den Dateinamen nicht fest codieren möchten, möchten Sie stattdessen den Variablennamen verwenden
"input.txt" = x
"output.txt" = y
Dies funktioniert insbesondere dann, wenn Sie dies wahrscheinlich in einem Python-Programm mit dem Befehl os.system verwenden
quelle
Dies könnte auch der Fall sein.
Wenn Sie die Datei nicht in einer Variablen angegeben und die Ausgabe darauf umgeleitet haben, löst bash diesen Fehler aus.
Die Variable out_file ist nicht korrekt eingerichtet. Behalten Sie dies ebenfalls im Auge. Übrigens druckt dieser Code den gesamten Inhalt und seinen Dateinamen auf der Konsole.
quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, die Klammererweiterung zum Schreiben der Ausgabe in mehrere Dateien zu verwenden.
Zum Beispiel:
echo "text" > {f1,f2}.txt
Ergebnisse in-bash: {f1,f2}.txt: ambiguous redirect
Verwenden Sie
tee
in diesem Fall die Ausgabe in mehrere Dateien:die
1>/dev/null
den Text nicht geschrieben verhindern stdoutWenn Sie an die Datei (en) anhängen möchten, verwenden Sie
tee -a
quelle