Qual é o propósito do comando 'sh'?

5

Qual é o objetivo do comando sh quando usado interativamente e quando usado dentro de um script bash?

Além da linha hash bang (a primeira linha), sh deve ser substituído por bash em um sistema bash?

Exemplo:

#!/bin/bash
sh -c "command"
    
por H2ONaCl 05.04.2012 / 15:29

5 respostas

12

Tantas perguntas ... Eu as levo uma de cada vez.

1) Qual é o objetivo do comando sh quando usado interativamente? Fornece um novo contexto de ambiente, portanto, se você quiser experimentar algumas configurações de variáveis de ambiente, você pode. E quando você terminou, exit sem nenhum dano.

Além disso, se você estivesse em um shell diferente, como zsh ou csh, e quisesse executar em um shell sh , isso mudaria você.

2) Quando usado em um script bash como você tem acima, ele irá novamente fornecer um contexto de ambiente contido para o "comando" para executar. Você também pode usá-lo com o

#!/bin/bash
sh -c "command" &
e bifurque "comando" para rodar em paralelo com o resto do seu script.

3) Eu diria que, se é algo que precisa especificamente de bash , então coloque-o explicitamente em sua linha de hash bang. Mas como na maioria dos sistemas * nix posteriores sh é equivalente a bash , provavelmente não é necessário.

    
por 05.04.2012 / 15:45
6

O que acontece quando executo sh ?

Se você simplesmente iniciar sh no shell, você iniciará outro shell dentro do seu shell atual .

O que acontece quando eu uso sh em um script?

Da mesma forma, você inicia outro shell dentro do shell que está processando o script.

Devo simplesmente usar /bin/bash se é para isso que /bin/sh aponta?

Não . Se o script foi projetado para trabalhar com qualquer shell, ele é projetado para trabalhar contra o menor denominador comum entre todos os shells (no meu entender, isso é parte do < href="http://en.wikipedia.org/wiki/POSIX"> padrão POSIX )

Mudar para um intérprete específico não deve ser prejudicial (porque todos eles obedecem ao mesmo padrão), mas reduz a compatibilidade e, ao mesmo tempo, não oferece nenhum benefício.

Então, eu deveria sempre usar /bin/sh então?

Como intérprete

Não. Se você está escrevendo um script yourself , você também pode usar um interpretador mais específico (como o bash) se esse interpretador fornecer recursos adicionais que você deseja utilizar. Mas lembre-se de que todos que usarem seu script precisarão ter seu intérprete escolhido.

Para iniciar outro processo

Se você quiser simplesmente iniciar um novo processo em seu próprio contexto, use /bin/sh

.

Então, qual é o sentido disso tudo?

Se você quer executar algo em seu próprio contexto , você deve executá-lo em um novo shell.
A maneira mais fácil de conseguir isso é iniciar um novo shell (usando sh ) e passar o comando para ele.

Desde que o seu algo não seja um script criado especificamente para um shell específico, não há razão para invocar um shell específico. Apenas invoque qualquer shell, usando sh .

Se você tem um script, que usa uma sintaxe especial disponível apenas em bash , você deve definir o em conformidade.

    
por 05.04.2012 / 15:55
3

sh não é um comando shell, mas um programa que você está chamando. Sua linha pesquisará sh em seu caminho. Na maioria dos casos, ele só executará /bin/sh , que está no caminho.

Isso iniciará um novo processo.

/bin/sh não é garantido para ser bash, agora está em muitos sistemas bash mas em vários sistemas Unix é o shell Bourne. Se você executar /bin/sh , você pode esperar que um shell adira ao padrão POSIX.

    
por 05.04.2012 / 15:39
3

Por que / bin / sh ??

Como outros apontaram, você decide o que isso realmente significa :) (Ou a sua distro faz por você.)

Por bash, pelo menos, tem um significado particular ...

Na página do bash man:

" If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well. "

Então, se você / bin / sh apontar para / bin / bash, você terá esse comportamento.

#!/bin/bash

dá-lhe a bash "padrão" (e seus "bashisms")

claro / bin / sh pode ser um link para dizer / bin / dash ou ksh ou algum outro "shell".

A página man bash é enorme, mas essa informação em particular é apenas ... 145 linhas em:)

Há algumas boas apresentações sobre: O Guia Avançado de Script Bash é excelente.

link

Se você está no Debian / Ubuntu (ou outros derivados):

abs-guide - The Advanced Bash-Scripting Guide

debian-reference-en -> Debian system administration guide, English original

por exemplo,

apt-get install abs-guide

FYI dash: (editado abaixo na descrição)

$ apt-cache show dash

diz:

Description-en: POSIX-compliant shell The Debian Almquist Shell

(dash) is a POSIX-compliant shell derived from ash. .

Since it executes scripts faster than bash,

and has fewer library dependencies

(making it more robust against software or hardware failures),

it is used as the default system shell on Debian systems.

Homepage:

http://gondor.apana.org.au/~herbert/dash/

    
por 05.04.2012 / 19:29
2

1) É uma casca. Sua finalidade no modo interativo é ler a entrada do usuário e executar comandos especificados. No modo não interativo, ele lê todos os comandos do arquivo de script, por isso funciona sem que o usuário toque no teclado.

2) A diferença entre "sh -c command" e apenas "command" no arquivo de script é que no primeiro caso o comando é bifurcado de um processo de shell separado, enquanto no último caso ele é bifurcado do processo executando o shell principal script (ou seja, tem acesso aos seus descritores de arquivos, ambiente etc.). Portanto, temos processos adicionais na árvore de processos no primeiro caso e também algum grau de isolamento.

3) / bin / sh pode ser symlink para / bin / zsh (por exemplo), então, sim, se você pretende executar o script filho bash a partir do script principal bash você deve explicitamente dizer "bash -c". Se o script filho for independente de shell, "sh -c" também funcionará.

    
por 05.04.2012 / 15:54