Seu problema são as citações que você está usando. Você precisa usar aspas duplas para que as variáveis dentro, $@
, possam ser expandidas, caso contrário elas permanecerão literais e nunca serão expandidas.
Veja um exemplo
$ cat runme.bash
#!/bin/bash
echo "run with double quotes"
su -c "echo $@" user1
echo "run with single quotes"
su -c 'echo $@' user1
$ ./runme.bash "a b c"
run with double quotes
a b c
run with single quotes
$
Você também tem que passar a lista de argumentos como uma lista citada, caso contrário, o comando su -c ...
fica confuso e começa a tentar analisar o segundo argumento como o usuário que você deseja su
as.
Outro exemplo
$ ./runme.bash a b c
run with double quotes
su: user b does not exist
run with single quotes
$
Dica de depuração
Se você quiser ver o que o script realmente está fazendo, pode executá-lo com a opção -x
para bash
.
$ bash -x ./runme.bash a b c
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a' b c user1
su: user b does not exist
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1
$
argumentos citados
$ bash -x ./runme.bash "a b c"
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a b c' user1
a b c
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1
$