Existem dois problemas:
-
O uso de
$@
sem aspas.Isso faria com que o loop fosse iterado sobre
vlc
evideo.mp4
como dois itens separados, mesmo que estivessem dentro da mesma string citada na invocação do script. -
Usando um comando em uma variável.
Se o comando for algo mais complicado que um simples comando simples, isso não funcionará. Você teria que
eval
da string dada.
Levando isso em conta, seu script pode se parecer com
#!/bin/sh
for cmd do # or: for cmd in "$@"; do
eval "$cmd" 2>/dev/null
done
Chamando isso como
./script 'echo "hello world"' 'vim "$HOME/.profile"' 'tr a-z A-Z <"$HOME/.profile" | grep -c EXPORT'
primeiro executaria echo "hello world"
e, quando isso terminasse, abriria vim
para editar o arquivo nomeado naquele segundo comando. O último comando é mais complexo, mas manipulado pelo fato de usarmos eval
(ele apenas altera todos os caracteres alfabéticos para maiúsculos e conta o número de vezes que a string EXPORT
ocorre em um arquivo). É executado assim que sai a sessão vim
.
Com isso, você pode até fazer
./script 'd=$HOME' 'ls "$d"'
, por exemplo, defina variáveis que são usadas em comandos posteriores. Isso funciona porque os comandos chamados por eval
são executados no mesmo ambiente que o script. Isso não funcionaria se você iniciar os comandos como tarefas em segundo plano, como sugere o título da sua pergunta.