Je suis écrire un script pour lire la sortie dune commande dans les variables a et b. Ceci est le script
#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b"
et obtient lerreur de syntaxe comme suit:
line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)"
Mais lorsque je tape la même commande dans la console, cela fonctionne pour moi sans aucun problème.
app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED
Toute aide à ce sujet est vraiment appréciée.
Commentaires
Réponse
sh
(qui dans la plupart des systèmes (dérivés de Debian) est lié à dash
) ne permet pas la substitution de processus . Essayez dappeler par bash script.sh
. Le même appel par ./script.sh sexécute avec sha-bang
qui est /bin/bash
dans votre script.
Commentaires
- @MichaelDurrant Ah, votre modification signifie maintenant le contraire de ce que je voulais dire.
- @muru Je ne peux ' accepter la modification t o
bash
. Je veux dire exactementdash
.file $(which sh)
sortie/bin/sh: symbolic link to 'dash'
- Costas, que ' est ce que je signifiait. Michael Durrant a changé ma modification pour remplacer
dash
parbash
. Merci de lavoir corrigé. - Vous voulez dire la substitution de processus (
<( echo foo )
), pas la substitution de commande ($(echo foo)
) (qui fait partie de la spécification POSIX). - @chepner Vous avez raison. Merci pour le commentaire. Réparé.
Réponse
Jessayais dappeler le script en tant que sh file.sh et jobtenais lerreur . Mais quand jai appelé le même script que ./file.sh et bash file.sh, cela fonctionne et donne le résultat souhaité.
Réponse
De plus, vous pouvez simplement ajouter la ligne ci-dessous en haut de votre script:
#!/bin/bash
Il indique à votre terminal / console dexécuter votre script en tant que script bash, et que votre processus de substitution « <( cmd )
» fonctionnera correctement.
Commentaires
- Notez que le script de lOP ' avait déjà ce shebang, mais lOP était en cours dexécution comme
sh file.sh
au lieu defile.sh
ou./file.sh
(voir leur propre réponse )
$ ./script.sh
sh
don ' t autorise la substitution de commandes. Essayez de linvoquer parbash script.sh
. Le même appel par./script.sh
sexécute avecsha-bang
qui est / bin / ** bash ** dans votre script.