237 votes

Obtention d'une erreur de "redirection ambiguë".

La ligne suivante dans mon Bash script

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

me donne cette erreur :

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Pourquoi ?

11 votes

Vous ne montrez pas tout. où avez vous obtenu ${OUPUT_RESULTS} . C'est aussi une erreur d'orthographe si vous voulez dire $OUTPUT_RESULTS}

0 votes

Si on a écrit OUPUT_RESULTS = "filename.log" on obtiendra une redirection ambiguë. Parce que bash ne veut PAS d'espace autour du = opérateur.

358voto

nobar Points 5849

Bash peut être assez obtus parfois.

Les commandes suivantes renvoient toutes des messages d'erreur différents pour une erreur fondamentalement identique :

$ 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

L'ajout de guillemets autour de la variable semble être un bon moyen de traiter le message "redirection ambiguë" : Vous avez tendance à obtenir un meilleur message lorsque vous avez fait une erreur de frappe -- et lorsque l'erreur est due à des espaces dans le nom du fichier, l'utilisation de guillemets est la solution.

1 votes

Vous obtiendrez également ceci si vous redirigez la sortie d'un script qui contient des redirections. Ne me demandez pas comment je le sais.

1 votes

@PaulJackson, ...ce n'est pas vrai. Comme un démonstrateur de copier-coller : sh -c 'echo hello >/tmp/hello' >/tmp/world fonctionne correctement.

0 votes

Peut-être un ajout précieux, pour moi utiliser sh au lieu de bash était une solution. Ceci : for f in onfw/* ; do xslt -xsl:dwsToTEI.xslt -s:- < "$f" > data/ basename "$f" ; cela fonctionne dans sh, bash donne une redirection ambiguë pour les noms de fichiers avec des espaces (la citation n'a pas aidé).

33voto

Avez-vous une variable nommée **OU**PUT_RESULTS ou est-ce le plus probable **OUT**PUT_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$

3 votes

Si votre ABC="junk file.txt" le problème subsisterait.

0 votes

Cette réponse m'a également conduit à ma solution. J'ai défini une variable comme INPUT mais l'utilisait comme Input . Sensibilité à la casse pour la victoire !

19voto

ghostdog74 Points 86060

Mettez des guillemets autour de votre variable. Si elle comporte des espaces, vous obtiendrez une "redirection ambiguë". Vérifiez également votre orthographe.

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

eg de redirection ambiguë

$ 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 votes

Les citations n'ont pas d'importance. S'il y a des espaces dans l'expansion de la variable, vous obtiendrez des résultats dans le mauvais fichier et/ou des messages d'erreur erronés impliquant la partie post-espace du nom du fichier.

0 votes

@JUSTMYcorrectOPINION, l'interpréteur de commandes ne re-parse pas après les expansions de paramètres - ce qui signifie que le contenu après l'espace dans les résultats de l'expansion ne peut pas entraîner le remplissage d'un morceau différent de syntaxe.

7voto

AixNPanes Points 1

J'ai récemment découvert que les blancs dans le nom du fichier de redirection provoquent le message "redirection ambiguë".

Par exemple, si vous redirigez vers application$(date +%Y%m%d%k%M%S).log et que vous spécifiez les mauvais caractères de formatage, la redirection échouera avant 10 heures du matin par exemple. Si toutefois vous avez utilisé application$(date +%Y%m%d%H%M%S).log il réussirait. Cela est dû au fait que le %k Le format donne ' 9' pour 9 heures du matin où %H donne '09' pour 9 heures.

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

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

La date erronée pourrait donner quelque chose comme :

echo "a" > myapp20140626 95138.log

où ce qui suit est ce qui serait souhaité :

echo "a" > myapp20140626095138.log

0 votes

L'erreur est que vous devez mettre des guillemets autour de la variable, qu'elle contienne ou non des espaces. Voir Quand mettre des guillemets autour d'une variable shell ?

6voto

Thomas Points 8142

Le chemin spécifié dans ${OUPUT_RESULTS} contient-il des caractères d'espacement ? Si c'est le cas, vous pouvez envisager d'utiliser ... >> "${OUPUT_RESULTS}" (en utilisant des guillemets).

(Vous pouvez également envisager de renommer votre variable en ${OUTPUT_RESULTS} )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X