Es wird ein Fehler "Mehrdeutige Weiterleitung" angezeigt

173

Die folgende Zeile in meinem Bash-Skript

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

gibt mir diesen Fehler:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Warum?

Mach den Weg frei
quelle
10
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.

Brent Bradburn
quelle
1
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?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 
NUR MEINE RICHTIGE MEINUNG
quelle
2
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

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

zB von mehrdeutiger Weiterleitung

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag
Ghostdog74
quelle
1
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 .

echo $(date +%Y%m%d%k%M%S) gibt 20140626 95138

echo $(date +%Y%m%d%H%M%S) gibt 20140626095138

Das fehlerhafte Datum könnte Folgendes ergeben:

echo "a" > myapp20140626 95138.log

wo das Folgende erwünscht wäre:

echo "a" > myapp20140626095138.log
AixNPanes
quelle
Der Fehler besteht darin, dass Sie die Variable in Anführungszeichen setzen sollten, unabhängig davon, ob sie Leerzeichen enthält. Siehe Wann werden Anführungszeichen um eine Shell-Variable gewickelt?
Tripleee
5

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})

Thomas
quelle
1

Ich hatte gerade diesen Fehler in einem Bash-Skript. Das Problem war ein versehentlicher Fehler am Ende der vorherigen Zeile, der einen Fehler verursachte.

Wayne Workman
quelle
1

Eine andere Sache, die eine "mehrdeutige Umleitung" verursachen kann, ist \t \n \rder Variablenname, den Sie ebenfalls schreiben

Vielleicht nicht \n\r? Aber seien Sie vorsichtig

Versuche dies

echo "a" > ${output_name//[$'\t\n\r']}

Ich wurde mit diesem beim Parsen von HTML, Tabs \tam Anfang der Zeile getroffen.

Jim
quelle
Der Fehler zitiert die Variable nicht. Siehe Wann werden Anführungszeichen um eine Shell-Variable gewickelt?
Tripleee
1

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:

  1. vim a.sh um das Skript zu erstellen
  2. zu bearbeitendes Skript bearbeiten (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh um es ausführbar zu machen
  4. 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. "

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

Enharmonic
quelle
0

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

Anusree
quelle
0

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.

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.

Rahul Rajput
quelle
0

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}.txtErgebnisse in-bash: {f1,f2}.txt: ambiguous redirect

Verwenden Sie teein diesem Fall die Ausgabe in mehrere Dateien:

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

die 1>/dev/nullden Text nicht geschrieben verhindern stdout

Wenn Sie an die Datei (en) anhängen möchten, verwenden Sie tee -a

Spektrum
quelle