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.
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
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.
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})
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:
vim a.sh pour créer le script
modifier le script pour contenir (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh pour le rendre exécutable
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. "
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
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
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.
${OUPUT_RESULTS}
. C'est aussi une faute d'orthographe si vous vouliez dire$OUTPUT_RESULTS}
OUPUT_RESULTS = "filename.log"
un, il obtiendra une redirection ambiguë. Parce que bash ne veut AUCUN ESPACE autour de l'=
opérateur.Réponses:
Bash peut parfois être assez obtus.
Les commandes suivantes renvoient toutes des messages d'erreur différents pour essentiellement la même erreur:
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.
la source
sh -c 'echo hello >/tmp/hello' >/tmp/world
fonctionne correctement.Avez-vous nommé une variable
OUPUT_RESULTS
ou est-ce la plus probableOUTPUT_RESULTS
?la source
ABC="junk file.txt"
, cela aurait toujours le problème.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
par exemple d'une redirection ambiguë
la source
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).log
et 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).log
cela réussirait. En effet , les%k
rendements de format' 9'
pour 9 heures où les%H
rendements'09'
pour 9 heures.echo $(date +%Y%m%d%k%M%S)
donne20140626 95138
echo $(date +%Y%m%d%H%M%S)
donne20140626095138
La date erronée peut donner quelque chose comme:
où ce qui suit est ce qui serait souhaité:
la source
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}
)la source
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.
la source
Une autre chose qui peut provoquer une «redirection ambiguë» est également
\t
\n
\r
le nom de la variable que vous écrivezPeut-être pas
\n\r
? Mais faites preuve de prudenceEssaye ça
J'ai été frappé avec celui-ci en analysant le HTML, les onglets
\t
au début de la ligne.la source
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:
vim a.sh
pour créer le script(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
pour le rendre exécutablea.sh
Si vous faites cela, vous obtiendrez "/home/ubuntu/a.sh: ligne 1: $ logit: redirection ambiguë". Ceci est dû au fait
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
la source
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
cela fonctionnera de cette façon surtout si vous l'utilisez dans un programme python avec la commande os.system probablement
la source
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.
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.
la source
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}.txt
résulte en-bash: {f1,f2}.txt: ambiguous redirect
Dans ce cas, utilisez
tee
pour exporter vers plusieurs fichiers:l'
1>/dev/null
empêchera le texte d'être écrit à stdoutSi vous souhaitez ajouter au (x) fichier (s), utilisez
tee -a
la source