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?

Ouvrez la voie
la source
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.

Brent Bradburn
la source
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$ 
JUSTE MON AVIS correct
la source
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
ghostdog74
la source
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
AixNPanes
la source
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})

Thomas
la source
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.

Wayne Workman
la source
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.

Jim
la source
L'erreur ne cite pas la variable. Voir Quand placer des guillemets autour d'une variable shell?
tripleee le
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

enharmonique
la source
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

Anusree
la source
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.

Rahul Rajput
la source
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

spectre
la source