O que é o comando sh -c?

11

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

    
por Lan... 01.10.2016 / 09:25

3 respostas

24

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
    
por Zanna 01.10.2016 / 09:34
9

O argumento -c é:

  

Lê comandos do operando command_string em vez de usar o comando   entrada padrão. O parâmetro especial 0 será definido a partir do command_name   operando e os parâmetros posicionais ($ 1, $ 2, etc.) definidos a partir do   operandos de argumento restantes.

Outros detalhes sobre os sh arugments podem ser encontrados executando:

$ man sh

Um exemplo de uso de uma string como argumento é:

$ sh -c "echo This is a test string"

Este é um exemplo mais detalhado de sh -c . Ele fará o download de um documento do Google Drive e será aberto 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"
    
por L. D. James 01.10.2016 / 09:33
9

sh -c gera uma sessão não-login , não-interativa de sh ( dash no Ubuntu).

O comando seguinte será executado nessa sessão de shell, será tratado como argumento (parâmetro posicional) 0 ( ARGV0 ) e a porção restante como o argumento para esse comando ( ARGV0 ), a partir de 1 ( ARGV1 , ARGV2 , ...).

Você também pode usar recursos típicos de shell que podem ser executados nesse tipo de sessão, por exemplo, separação de comando usando ; para usar vários comandos, agrupamento de comandos usando {} , gerar outro subshell com () e assim por diante. A utilização destes pode alterar ligeiramente as definições / exemplos de argumentos mencionados anteriormente.

Apenas para observar, os recursos específicos para shells interativos somente (por padrão), por exemplo A expansão do histórico, source -ing de ~/.bashrc e /etc/bash.bashrc etc, não estará disponível nesta sessão, pois é não-interativo . Você pode simular um comportamento de sessões interativas (quase), usando a opção -i :

sh -ic ...

Da mesma forma, os recursos que são específicos para os login shells somente (por padrão), por exemplo, source -ing de ~/.profile (dado ~/.bash_profile e ~/.bash_login não existem) e /etc/profile não será feito porque o shell é um shell não-login . Você pode simular o comportamento de login-shells usando a opção -l :

sh -lc ...

Para simular sessões de login e interativas:

sh -lic ...
    
por heemayl 01.10.2016 / 11:30

Tags