sh
chama o programa sh
como intérprete e o -c
sinalizador executa o seguinte comando conforme interpretado por este programa.
No Ubuntu, sh
é geralmente ligado por links simbólicos a /bin/dash
, o que significa que se você executar um comando com sh -c
, o painel será usado para executar o comando em vez de bash. O shell chamado com sh
depende do symlink - você pode descobrir com readlink -e $(which sh)
. Você deve usar sh -c
quando quiser executar um comando especificamente com esse shell em vez de bash.
Você pode usar essa sintaxe (o -c
flag) com outros intérpretes também. Um uso clássico dele (apontado por @edwinksl é para contornar o problema do redirecionamento não funciona com o sudo (aqui você pode usar bash -c
ou sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
vai escrever o arquivo bar
contendo o texto foo
to /home/
, enquanto sudo echo "foo" > /home/bar
falha como explicado muito bem aqui
É importante usar "aspas simples" ao redor da string de comando, caso contrário, o shell atual tentará expandi-lo antes de ser passado para o intérprete que você chamou
por exemplo (com python até eu pensar em um comando que daria resultados diferentes em traço ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token '('
$ python3 -c 'print (35/7)'
5.0