Obtention d'une erreur de "redirection ambiguë"


173

La ligne suivante dans mon script Bash

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

me donne cette erreur:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Pourquoi?


10
vous ne montrez pas tout. où avez-vous ${OUPUT_RESULTS}. C'est aussi une faute d'orthographe si vous vouliez dire$OUTPUT_RESULTS}
ghostdog74

si on en a écrit OUPUT_RESULTS = "filename.log"un, il obtiendra une redirection ambiguë. Parce que bash ne veut AUCUN ESPACE autour de l' =opérateur.
Poutrathor

Réponses:


270

Bash peut parfois être assez obtus.

Les commandes suivantes renvoient toutes des messages d'erreur différents pour essentiellement la même erreur:

$ 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 gérer le message de "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 de fichier, l'utilisation de guillemets est la solution.


1
Vous obtiendrez également cela si vous redirigez la sortie d'un script contenant des redirections. Ne me demandez pas comment je sais cela.
Paul Jackson

@PaulJackson, ... ce n'est pas vrai. En tant que démonstrateur à copier-coller: sh -c 'echo hello >/tmp/hello' >/tmp/worldfonctionne correctement.
Charles Duffy

24

Avez-vous nommé une variable OUPUT_RESULTSou est-ce la plus probable 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$ 

2
Si votre ABC="junk file.txt", cela aurait toujours le problème.
Charles Duffy

15

mettez des guillemets autour de votre variable. S'il y a des espaces, il vous donnera également une "redirection ambiguë". vérifiez également votre orthographe

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

par exemple d'une 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
Les citations n'ont pas d'importance. S'il y a des espaces dans l'expansion des variables, vous obtiendrez simplement les choses dans le mauvais fichier et / ou des messages d'erreur faux impliquant la partie post-espace du nom de fichier.
JUSTE MON OPINION correcte

@JUSTMYcorrectOPINION, le shell ne réanalyse pas après l'expansion des paramètres - ce qui signifie que le contenu après l'espace dans les résultats d'expansion ne peut pas entraîner le remplissage d'un morceau de syntaxe différent.
Charles Duffy

5

J'ai récemment découvert que les espaces vides 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).loget que vous spécifiez les mauvais caractères de mise en forme, la redirection échouera avant 10 heures par exemple. Si toutefois vous l'utilisiez, application$(date +%Y%m%d%H%M%S).logcela réussirait. En effet , les %krendements de format ' 9'pour 9 heures où les %Hrendements '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 peut donner quelque chose comme:

echo "a" > myapp20140626 95138.log

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

echo "a" > myapp20140626095138.log

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

5

Le chemin spécifié dans $ {OUPUT_RESULTS} contient-il des espaces? Si tel 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})


1

Je viens d'avoir cette erreur dans un script bash. Le problème était un \ accidentel à la fin de la ligne précédente qui donnait une erreur.


1

Une autre chose qui peut provoquer une «redirection ambiguë» est également \t \n \rle nom de la variable que vous écrivez

Peut-être pas \n\r? Mais faites preuve de prudence

Essaye ça

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

J'ai été frappé avec celui-ci en analysant le HTML, les onglets \tau début de la ligne.



1

Si la redirection de votre script contient une variable et que le corps du script définit cette variable dans une section entre parenthèses, vous obtiendrez l'erreur "redirection ambiguë". Voici un exemple reproductible:

  1. vim a.sh pour créer le script
  2. modifier le script pour contenir (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh pour le rendre exécutable
  4. a.sh

Si vous faites cela, vous obtiendrez "/home/ubuntu/a.sh: ligne 1: $ logit: redirection ambiguë". Ceci est dû au fait

"Le fait de placer une liste de commandes entre parenthèses entraîne la création d'un sous-shell et l'exécution de chacune des commandes de la liste dans ce sous-shell, sans supprimer les variables non exportées. La liste étant exécutée dans un sous-shell, les affectations de variables ne restent pas en vigueur après la fin du sous-shell. "

De Utiliser des parenthèses pour regrouper et développer des expressions

Pour corriger cela, vous pouvez modifier le script à l'étape 2 pour définir la variable en dehors des parenthèses: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

si vous utilisez un nom de variable dans la commande shell, vous devez le concaténer avec +signe.

par exemple :

si vous avez deux fichiers et que vous n'allez pas coder en dur le nom du fichier, vous voulez plutôt utiliser le nom de la variable
"input.txt" = x
"output.txt" = y

then ('commande shell entre guillemets' + x> + y)

cela fonctionnera de cette façon surtout si vous l'utilisez dans un programme python avec la commande os.system probablement


0

Cela pourrait aussi être le cas.

vous n'avez pas spécifié le fichier dans une variable et redirigé la sortie vers celui-ci, alors bash lancera cette erreur.

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

La variable out_file n'est pas configurée correctement, alors gardez un œil sur cela aussi. BTW ce code imprime tout le contenu et son nom de fichier sur la console.


0

J'ai eu cette erreur en essayant d'utiliser l'expansion d'accolades pour écrire la sortie dans plusieurs fichiers.

par exemple: echo "text" > {f1,f2}.txtrésulte en-bash: {f1,f2}.txt: ambiguous redirect

Dans ce cas, utilisez teepour exporter vers plusieurs fichiers:

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

l' 1>/dev/nullempêchera le texte d'être écrit à stdout

Si vous souhaitez ajouter au (x) fichier (s), utilisez tee -a

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.