Récemment, jai utilisé la commande echo en la préfixant avec $. À ma grande surprise, il en résulta une erreur. Ma commande était quelque chose comme ça.

# !/bin/bash $(echo "a") 

Lerreur était ..

./test1.sh: line 3: a: command not found 

Quelquun peut-il expliquer ce qui se passe ici. Merci davance.

Réponse

$(echo a) est une « substitution de commande ». Le $(...) sera remplacé par le sortie de la commande dans . La sortie dans ce cas est a, que le shell essaie ensuite dexécuter. Le shell ne peut « t localiser la commande appelée a et vous obtenez le message derreur.

Il est difficile de savoir quelle était votre intention ou ce que vous attendiez . Il est très inhabituel de vouloir exécuter le résultat d’une substitution de commande.


Certains programmes produisent des chaînes qui doivent être évaluées par le shell. Il est donc possible de voir le code comme

eval "$(ssh-agent)" 

qui évalue (exécute) la sortie de la commande donnée. Ces commandes ont une sortie strictement spécifiée et sont généralement considérées comme sûres à exécuter dans ce Dans lexemple ci-dessus, ssh-agent démarrera le processus de lagent SSH et affichera quelques commandes qui définiront les variables denvironnement appropriées que ssh le client devra ultérieurement utiliser lagent, par exemple,

SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018; 

Ceci est ensuite évalué par eval.

eval est utilisé ici plutôt que simplement en utilisant simplement $(ssh-agent) puisque la sortie de la commande ssh-agent est plus une commande composée. Sans eval, les terminateurs de commande ; seraient vraiment spéciaux.

Exemple:

$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world 

Commentaires

  • OTOH, eval "$(dircolors)" est une chose raisonnable à faire. Idem avec plusieurs autres commandes qui suivent ce modèle, comme gpg-agent.
  • @derobert Oui et $(ssh-agent). Bon point.

Réponse

Vous pouvez utiliser set -x pour voir ce que fait le shell:

set -x $(echo "a") ++ echo a + a 

Le shell exécute echo a et place la sortie sur la ligne de commande. Cest la même chose que si vous aviez essayé dexécuter cette ligne de commande:

a 

Le shell recherche une commande a dans le chemin (et même avant dans les listes de fonctions, dalias et de hachage), ne le trouve pas et renvoie donc une erreur.

Cela fonctionne si la sortie est une commande valide:

$(echo "ls") 

Commentaires

  • pouvez-vous me dire, pourquoi nous utilisons en fait $ other puis appelons une variable.
  • @Ashu Il est évidemment également utilisé pour la substitution de commandes – votre cas. En outre, il apparaît dans le calcul (echo $((1+2+3))), la création de chaîne ($'foo\nbar' / $"foo") et (moins lié au shell) dans les expressions régulières que bash comprend ([[ foo =~ ^f..$ ]]). Il est également utilisé pour modifier les variables de plusieurs manières: ${foo#bar}

Laisser un commentaire

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