3 votes

/bin/sh : différence entre variable et commande directe

Imaginez que j'ai le bash suivant script :

#/bin/sh
#next line will work correctly, outputting user name and current directory
start-stop-daemon --start --exec /bin/su -- root -c 'whoami; ls'

MYVAR="start-stop-daemon --start --exec /bin/su -- root -c 'whoami; ls'"
#next line will fail with following error:
#ls': -c: line 0: unexpected EOF while looking for matching `''
$MYVAR

Question - pourquoi la deuxième approche via la variable ne fonctionne pas ? Comment la faire fonctionner ?

2voto

nullDev Points 1778

Comme @lled l'a expliqué, le problème est que le Shell traite les guillemets avant d'étendre les variables, donc mettre des guillemets dans les variables ne fait rien d'utile. Mais il existe quelques alternatives, selon la raison pour laquelle vous voulez stocker la commande (plutôt que de l'exécuter directement).

Si vous souhaitez définir la commande une seule fois, puis l'utiliser à plusieurs reprises, utilisez une fonction :

myfunc() {
    start-stop-daemon --start --exec /bin/su -- root -c 'whoami; ls'
}
# ...
myfunc

Si vous devez construire/sélectionner la commande à un endroit, puis l'utiliser à un autre endroit, vous pouvez utiliser un tableau bash pour la stocker. Stockez chaque "mot" de la commande en tant qu'élément du tableau, et si vous le référencez correctement, les coupures de mots seront préservées :

myarray=(start-stop-daemon --start --exec /bin/su -- root -c 'whoami; ls')
# ...
"${myarray[@]}"

Ce qui se passe ici est que le tableau est défini comme ayant les éléments "start-stop-daemon", "--start", "--exec", "/bin/su", "--", "root", "-c", et "whoami ; ls". Les guillemets simples ne sont pas stockés comme faisant partie du tableau, mais ils ont pour effet de faire de "whoami ; ls" un élément unique du tableau. Ensuite, lors de l'expansion du tableau, la balise [@] indique au Shell de développer chaque élément du tableau en un mot séparé, et les doubles-quotes qui l'entourent empêchent toute division supplémentaire des mots sur les valeurs résultantes.

Pour plus d'informations (et quelques autres options), voir BashFAQ #50:J'essaie de mettre une commande dans une variable, mais les cas complexes échouent toujours !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X