Como explicou @lled, o problema é que o shell processa aspas antes de expandir as variáveis, portanto, colocar cotações em variáveis não faz nada útil. Mas há algumas alternativas, dependendo de por que você deseja armazenar o comando (em vez de apenas executá-lo diretamente).
Se você quiser apenas definir o comando uma vez, use-o repetidamente, use uma função:
myfunc() {
start-stop-daemon --start --exec /bin/su -- root -c 'whoami; ls'
}
# ...
myfunc
Se você precisar criar / selecionar o comando em um lugar e, em seguida, usá-lo em outro local, poderá usar um array bash para armazená-lo. Armazene cada "palavra" do comando como um elemento da matriz e, se você fizer referência correta a ela, essas quebras de palavras serão preservadas:
myarray=(start-stop-daemon --start --exec /bin/su -- root -c 'whoami; ls')
# ...
"${myarray[@]}"
O que acontece aqui é que a matriz é definida como tendo os elementos "start-stop-daemon", "--start", "--exec", "/ bin / su", "-", "root "," -c "e" whoami; ls ". As aspas simples não são armazenadas como parte da matriz, mas têm o efeito de tornar "whoami; ls" um único elemento da matriz. Então, na expansão da matriz, o [@]
diz ao shell para expandir cada elemento da matriz em uma palavra separada, e as aspas duplas em torno dele evitam qualquer divisão adicional de palavras nos valores resultantes.
Para mais informações (e algumas outras opções), veja BashFAQ # 50: Estou tentando colocar um comando em um variável, mas os casos complexos sempre falham!