Respostas:
shchama o programa shcomo intérprete e o -csinalizador significa executar o seguinte comando, conforme interpretado por este programa.
No Ubuntu, shgeralmente é vinculado a um link simbólico /bin/dash, o que significa que, se você executar um comando com sh -co shell do traço, será usado para executar o comando em vez do bash. O shell chamado with shdepende do link simbólico - você pode descobrir com readlink -e $(which sh). Você deve usar sh -cquando quiser executar um comando especificamente com esse shell em vez de bash.
Você também pode usar esta sintaxe (a -cbandeira) com outros intérpretes. Um uso clássico dele (apontado por @edwinksl é contornar o problema do redirecionamento que não funciona com o sudo (aqui você pode usar bash -cou sh -c)
sudo sh -c 'echo "foo" > /home/bar'
irá gravar o arquivo barque contém o texto foopara /home/, enquanto sudo echo "foo" > /home/barnão como explicou muito bem aqui
É importante usar 'aspas simples' ao redor da cadeia 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é pensar em um comando que daria resultados diferentes no traço ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
O -cargumento é:
Leia comandos do operando command_string em vez da entrada padrão. O parâmetro especial 0 será definido no operando command_name e os parâmetros posicionais ($ 1, $ 2, etc.) definidos nos demais operandos do argumento.
Outros detalhes das shdeclarações podem ser encontrados executando:
$ man sh
Um exemplo do uso de uma string como argumento é:
$ sh -c "echo This is a test string"
Este é um sh -cexemplo mais detalhado . Ele fará o download de um documento do Google Drive e o abrirá para edição na área de trabalho:
$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
sh -cgera um non-login , não-interativo sessão sh( dashno Ubuntu).
O seguinte comando que será executado nessa sessão shell, ele será tratado como argumento (parâmetro posicional) 0 ( ARGV0), eo restante como o argumento para esse comando ( ARGV0), a partir de 1 ( ARGV1, ARGV2...).
Você também pode usar os recursos típicos do shell que podem ser executados neste tipo de sessão, por exemplo, separação de comandos usando ;vários comandos, agrupamento de comandos {}, gerar outro subshell ()e assim por diante. O uso deles pode alterar levemente as definições / exemplos de argumentos mencionados anteriormente.
Apenas para observar, os recursos que são específicos apenas para shells interativos (por padrão), por exemplo, expansão do histórico, source-ing de ~/.bashrce /etc/bash.bashrcetc. não estarão disponíveis nesta sessão, pois não são interativos . Você pode simular um comportamento de sessões interativas (quase), usando a -iopção:
sh -ic ...
Da mesma forma, os recursos que são específicos apenas para os shells de login (por padrão), por exemplo, source-ing de ~/.profile(dados ~/.bash_profilee ~/.bash_loginnão existem) e /etc/profilenão serão feitos, pois o shell é um shell que não é de login . Você pode simular o comportamento das conchas de login usando a -lopção:
sh -lc ...
Para simular sessões de login e interativas:
sh -lic ...
sh -c? Seria muito bom se demonstrar a atribuição de parâmetros posicionais mencionados na-cparte deman sh.