Existem dois problemas:
-
O uso de
$@sem aspas.Isso faria com que o loop fosse iterado sobre
vlcevideo.mp4como 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
evalda 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.