Respostas:
sh
chama o programa sh
como intérprete e o -c
sinalizador significa executar o seguinte comando, conforme interpretado por este programa.
No Ubuntu, sh
geralmente é vinculado a um link simbólico /bin/dash
, o que significa que, se você executar um comando com sh -c
o shell do traço, será usado para executar o comando em vez do bash. O shell chamado with sh
depende do link simbólico - 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ê também pode usar esta sintaxe (a -c
bandeira) 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 -c
ou sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
irá gravar o arquivo bar
que contém o texto foo
para /home/
, enquanto sudo echo "foo" > /home/bar
nã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 -c
argumento é:
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 sh
declaraçõ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 -c
exemplo 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 -c
gera um non-login , não-interativo sessão sh
( dash
no 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 ~/.bashrc
e /etc/bash.bashrc
etc. 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 -i
opçã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_profile
e ~/.bash_login
não existem) e /etc/profile
nã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 -l
opçã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-c
parte deman sh
.