Qual é o comando sh -c?


30

Eu descobri o sh -ccomando. Eu o encontrei antes de postar aqui, mas não consigo encontrar nenhuma postagem do Google que o explique, então gostaria de saber o que é e qual é sua sintaxe completa.

Respostas:


34

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

Você pode fornecer um exemplo de como usar sh -c? Seria muito bom se demonstrar a atribuição de parâmetros posicionais mencionados na -cparte de man sh.
Edwinksl

15

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"

11

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 ...

+1 "sh -c gera uma sessão sem login e não interativa de sh"
JSON C11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.