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 !