Você está interpretando a página man errada. Em primeiro lugar, a parte sobre --
sinalizando o fim das opções é irrelevante para o que você está tentando fazer. O -c
substitui o resto da linha de comando daquele ponto em diante, de modo que ele não está mais passando pelo tratamento de opções do bash, significando que o --
seria passado para o comando, não tratado pelo bash como fim de marcador de opções.
O segundo erro é que argumentos extras são designados como parâmetros posicionais para o processo de shell que é lançado, não passados como argumentos para o comando. Então, o que você está tentando fazer pode ser feito como um dos seguintes:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
No primeiro caso, passando os parâmetros $0
e $1
explicitamente, e no segundo caso, usando "$@"
para expandir como normal como "todos os parâmetros posicionais exceto $ 0". Note que nesse caso temos que passar algo para ser usado como $0
também; Eu escolhi "bash" pois é isso que normalmente seria $0
, mas qualquer outra coisa funcionaria.
Como a razão é feita desta maneira, ao invés de apenas passar quaisquer argumentos que você der diretamente para o comando que você lista: note que a documentação diz que "comando s é lido na string", plural. Em outras palavras, esse esquema permite que você faça:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
Mas, observe que uma maneira melhor de atingir sua meta original pode ser usar env
em vez de bash
:
/usr/bin/env -- "ls" "-l"
Se você não precisa de nenhum dos recursos que um shell está fornecendo, não há razão para usá-lo - usar env
nesse caso será mais rápido, mais simples e menos digitação. E você não precisa pensar com tanta dificuldade para garantir que ele manipule com segurança nomes de arquivos contendo metacaracteres ou espaços em branco do shell.