erreur de syntaxe près du jeton inattendu `< '

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

  • Je ne parviens pas à reproduire ce comportement à partir du script. Comment invoquez-vous le script? Jinvoque en tant que: $ ./script.sh
  • @Ketan Je linvoque en tant que sh script.sh. Je viens dessayer dutiliser ./script.sh et cela donne le résultat souhaité. La valeur de a est FAILED La valeur de b est STARTED. Merci beaucoup pour la réponse … Je veux juste savoir pourquoi cest différent lors de lexécution du même script en utilisant sh file.sh et ./file.sh ??
  • Supposons sh don ' t autorise la substitution de commandes. Essayez de linvoquer par bash script.sh. Le même appel par ./script.sh sexécute avec sha-bang qui est / bin / ** bash ** dans votre script.
  • @SudevJash voir: Quelle est la différence entre ./ et sh pour exécuter un script?
  • @Costas Oui, cela fonctionne bien même avec bash script.sh et jobtiens le résultat souhaité … Merci beaucoup …

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 exactement dash. 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 par bash. 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 de file.sh ou ./file.sh (voir leur propre réponse )

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *