2010-03-17 10 views
117

Die folgende Zeile in meinem Bash-SkriptEin Angebot "mehrdeutig Umleitung" Fehler

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

gibt mir diese Fehlermeldung:

line 46: ${OUPUT_RESULTS}: ambiguous redirect 

Warum?

+6

Sie zeigen nicht alle. Woher hast du '$ {OUPUT_RESULTS}'? Es ist auch ein Schreibfehler, wenn Sie '$ OUTPUT_RESULTS} gemeint haben. – ghostdog74

Antwort

190

Bash kann manchmal ziemlich stumpf sein.

Die folgenden Befehle alle zurückgeben verschiedene Fehlermeldungen für im Grunde den gleichen Fehler:

$ 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 

Hinzufügen von Anführungszeichen um die Variable ein guter Weg zu sein scheint, mit der „mehrdeutig Umleitung“ Nachricht zu beschäftigen: Sie neigen dazu, zu erhalten eine bessere Nachricht, wenn Sie einen Tippfehler gemacht haben - und , wenn der Fehler auf Leerzeichen im Dateinamen zurückzuführen ist, die Verwendung von Anführungszeichen ist das Update.

+0

Sie erhalten dies auch, wenn Sie umleiten die Ausgabe eines Skripts, das Weiterleitungen enthält. Frag mich nicht, wie ich das weiß. –

+0

@PaulJackson, ... das ist nicht wahr. Als ein kopier- und einfügbarer Demonstrator: 'sh -c 'echo hallo>/tmp/hallo'>/tmp/world' funktioniert richtig. –

21

Haben Sie eine Variable mit dem Namen OUPUT_RESULTS oder ist es die wahrscheinlichere OUTPUT_RESULTS?


[email protected]:~/junk$ ABC=junk.txt 
[email protected]:~/junk$ echo "Booger" > $ABC 
[email protected]:~/junk$ echo "Booger" >> $ABB 
bash: $ABB: ambiguous redirect 
[email protected]:~/junk$ 
+0

Wenn Ihr' ABC = "junk file.txt" ', würde dies immer noch das Problem haben. –

5

Gibt den angegebenen Pfad in $ {} OUPUT_RESULTS keine Leerzeichen enthalten? Wenn dies der Fall ist, sollten Sie die Verwendung von ... >> "${OUPUT_RESULTS}" (mit Anführungszeichen) in Betracht ziehen.

(Sie können auch die Umbenennung Ihre Variable ${OUTPUT_RESULTS} zu betrachten)

+0

Vielen Dank an die vier Wähler! Leicht bitter, dass aus irgendeinem Grund eine Antwort, die 1,5 Jahre nach meiner Geburt gemacht wurde, aber genau die gleiche Lösung (Hinzufügen von Anführungszeichen) bot, stattdessen angenommen wurde. – Thomas

13

Put Anführungszeichen um Ihre Variable. Wenn es Leerzeichen gibt, wird es Ihnen auch "mehrdeutige Umleitung" geben. Ihre Rechtschreibung prüfen

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

zB mehrdeutiger Umleitung

$ 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 
+1

Zitate sind nicht wichtig. Wenn in der Variablenerweiterung Leerzeichen enthalten sind, werden nur die falschen Dateien und/oder falsche Fehlermeldungen angezeigt, die den Post-Space-Teil des Dateinamens betreffen. –

+3

@ttmrichter, es spielt eine Rolle! – ghostdog74

+0

Ich stehe korrigiert. Seltsam, das habe ich in der Vergangenheit noch nie gesehen. –

4

Ich habe kürzlich festgestellt, dass Leerzeichen im Namen der Redirect-Datei die Nachricht "mehrdeutige Umleitung" verursachen.

Zum Beispiel, wenn Sie umleiten an application$(date +%Y%m%d%k%M%S).log und Sie die falschen Formatierungszeichen angeben, wird die Umleitung vor 10 Uhr zum Beispiel fehlschlagen. Wenn Sie jedoch verwendet haben, wäre es erfolgreich. Dies liegt daran, dass das %k Format ' 9' für 9 AM ergibt, wobei %H'09' für 9 AM ergibt.

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

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

Die fehlerhafte Datum wie etwas geben könnte gibt:

echo "a" > myapp20140626 95138.log 

wo die folgende ist, was gewünscht würde:

echo "a" > myapp20140626095138.log 
+0

Sehr interessant. Dies verdient keinen Downvote. –

1

Eine andere Sache, die „mehrdeutige Umleitung“ ist \t\n\r im Variablennamen verursachen können Sie schreiben

Vielleicht \n\r nicht? Aber irren auf der Seite der Vorsicht

Versuchen Sie, diese

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

ich mit diesem getroffen wurde, während der HTML-Analyse, Tabs \t am Anfang der Zeile.

1

Ich hatte gerade diesen Fehler in einem Bash-Skript. Das Problem war ein zufälliges \ am Ende der vorherigen Zeile, die einen Fehler ergab.

Verwandte Themen