Qual é a diferença entre executar um script bash usando sh e ./

Essa mesma pergunta pode surgir ao usar qualquer tipo de script, não apenas os do bash. Existe uma grande diferença entre executar um script por meio do interpretador e executá-lo diretamente?

Mais um mistério que revelaremos neste interessante post de Let's Use Linux (uL).


Quando você executa um script passando o nome do arquivo do script para um interpretador (sh, python, perl, etc.), você está na verdade executando o interpretador, passando o programa que deseja executar como argumento. Por exemplo, executamos o interpretador sh passando o argumento miscript.sh.

sh meuscript.sh

Se você executar o script sozinho, o sistema chamará o intérprete de que precisa e, a seguir, sim, executará o script passando-o como argumento para o intérprete, mas tudo automaticamente e sem que o usuário que executou o script saiba isto.

./myscript.sh

Para executar um script sozinho, 2 condições devem ser atendidas:

1) o script deve incluir uma "linha de estrondo". Esta é a primeira linha de um script, que deve começar com os caracteres #! e que você deve especificar o caminho onde o intérprete está localizado. É importante notar que esta condição é verdadeira para qualquer tipo de script (python, perl, etc.), não apenas aqueles do bash.

Assim, por exemplo, nosso script deve conter o seguinte como a primeira linha:

#! / Bin / bash

2) o arquivo deve ter permissões de execução:

Para conceder permissões de execução ao nosso script, devemos escrever:

chmod a + x miscript.sh

Pronto, agora basta executá-lo assim:

./myscript.sh

Ou copiando o script para um caminho "especial" que permite que ele seja facilmente invocado. Por exemplo, podemos copiá-lo para / usr / sbin e executá-lo de qualquer lugar sem incluir o caminho completo onde está localizado:

Nós copiamos:

sudo cp miscript.sh / usr / sbin / miscript

Nós executamos:

escrever errado

Como você pode ver, na realidade o que acontece nos bastidores é muito semelhante em ambos os casos. Porém, ao incluir uma "linha de choque", seus scripts serão muito mais fáceis de distribuir, já que os usuários não precisarão se lembrar do caminho onde estão localizados os intérpretes necessários para executá-los. Conclusão: é basicamente uma questão de conforto.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   Oswaldo Villarroel dito

    Concordo com você Erpower, tanto a versão do interpretador quanto seu caminho são variáveis ​​e não constantes, ainda mais se for considerado que as distribuições GNU / Linux não são as únicas que utilizam Bash (existem também: freeBSD, OpenSolaris , Mac) e muitos deles têm configurações ou rotas diferentes.

    O importante é saber que você tem a flexibilidade (como você bem mencionou) para brincar com a chamada do script, seja com ./ ou com sh (ou python ... etc)

  2.   he_who_knows@gmail.com dito

    O Bash é um programa de computador cuja função é interpretar ordens.

    É baseado no shell Unix e é compatível com POSIX.

    em vez disso, sh é um programa de computador cuja função é interpretar ordens.
    Incorpora recursos como controle de processo, redirecionamento
    entrada / saída, listagem e leitura de arquivos, proteção,
    comunicações e uma linguagem de comando para escrever programas por
    lotes ou scripts. Foi o interpretador usado nas primeiras versões do Unix e se tornou um padrão de fato.

  3.   Diana C. dito

    Olá, sou iniciante no uso de scripts e gostaria de saber se alguém pode me ajudar com um problema que tenho:

    Estou gerenciando um programa que requer a inclusão de vários dados iniciais através do console e descobri que através de um script é possível executar o programa com os dados iniciais, para não ter que escrevê-lo repetidamente quando eu precisa executar o programa.

    Não sei como fazer isso, então se alguém puder me ajudar com isso ficarei muito grato.

  4.   Vamos usar Linux dito

    Veja, depende de qual linguagem de programação você está escrevendo o script. No entanto, em qualquer caso, o que você precisa é:

    1) Se você quiser que o usuário insira esses dados sempre que o script for executado, o procedimento mais comum é uma variável tomar os valores inseridos na entrada.

    2) Caso os valores sejam sempre iguais, você pode usar constantes.

    3) Outra opção é a possibilidade de seu script receber parâmetros.

    Felicidades! Paulo.

  5.   Vamos usar Linux dito

    É interessante o que você mencionou. É chamado de 2 formas: linha shebang ou linha diretamente bang. Eu te dou a informação: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Felicidades! Paulo.

  6.   @llomellamomario dito

    Interessante, nunca tinha parado para pensar nesse detalhe. Seria interessante ver mais artigos sobre retoque de consolador, entre eles a famosa recompilação do kernel para remover os quilos de código desnecessários que estão lá apenas para compatibilidade e melhorar a velocidade do sistema.

  7.   Vamos usar Linux dito

    OK. Eu vou ter em conta.
    Felicidades! Paulo.

  8.   Vamos usar Linux dito

    Estou feliz que funcionou. Sempre tento postar coisas que acho interessantes e práticas.
    Um abraço forte! Paulo.

  9.   Félix Manuel Brito Amarante dito

    Todo programador com bons hábitos adiciona uma "linha de estrondo" à primeira linha de código. Em Python, nunca esqueço a codificação e a linha de estrondo.
    #! / usr / bin / python2.7
    # *. * encoding = utf-8 *. *

  10.   diex02 dito

    Excelente, espero que você possa publicar mais informações sobre a linha de comando, especialmente quando se trata de compilar ou instalar a partir de arquivos fonte (tar.gz, etc.)

  11.   joe di castro dito

    Eu nunca tinha ouvido falar de "bang line", sempre a conheci como Shebang

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    lembranças

  12.   Jonathan Fernandez dito

    nota interessante ... obrigado!

  13.   eM Diga eM dito

    Que interessante, me declaro totalmente ignorante em programação e tudo relacionado a script, não tinha ideia de como funciona, mas notei que alguns têm esse cabeçalho.

  14.   Mario raimondi dito

    Um esclarecimento que aconteceu comigo tem a ver com esta entrada: Eu queria instalar um gadget de adobe air (uma calculadora de probabilidades de pôquer). O que o instalador do adobe air faz é executar o script correspondente com "su", mas no formato ./ solicitando a senha de root. Como o script não tinha permissão de execução, ele jogou permissão negada, a solução: execute o script com sh se não quiser alterar as permissões (mais rápido do que ir para a pasta tmp chmod e tudo mais). Lá o script é executado, chama o instalador do adobe e outra coisa de borboleta.

  15.   ero-sennin dito

    Artigo muito interessante! Obrigado por me ajudar a saber um pouco mais sobre o console. Vamos ver se você continua publicando artigos como esses ^^.
    Continue assim, este é sem dúvida o meu blog favorito !!

  16.   poder dito

    Lembre-se de que pode haver diferenças entre as versões do intérprete usadas. Executando o script diretamente de acordo com o shebang não há como indicar qual versão do intérprete usar, o que pode ser necessário. Se, em vez disso, você executar o interpretador e passar o script como um parâmetro, saberá qual versão dele está em execução.

    Por exemplo, em Python, se o shebang for #! / Usr / bin / python2.4, o programa será executado de forma diferente se for #! / Usr / bin / python2.6 ou se for #! / Usr / bin / python (que geralmente é um link simbólico para a versão do Python que é instalada e configurada por padrão). Isso ocorre porque o Python 2.6 tem uma nova funcionalidade que não existia no Python 2.4, portanto, escrever um script que use essa funcionalidade indicando um shebang #! / Usr / bin / python falhará se o sistema tiver apenas o python 2.4 instalado. Em vez disso, você sempre pode forçar a execução do script com a versão do python desejada, iniciando-o com "python2.4 /path/al/script.py" ou "python2.6 /path/al/script.py/

    Para scripts de shell, também existem diferenças entre os shells que você usa, portanto, usar #! / Bin / sh e #! / Bin / bash pode ter resultados diferentes dependendo do script. Se você escrever um script usando recursos que existem apenas no bash, mas especificar um #! / Bin / sh shebang, seu script provavelmente funcionará no Linux (na maioria das distribuições / bin / sh é um link simbólico para o bash), mas provavelmente falhará em outros UNIXs onde o bash não está instalado ou onde / bin / sh não é um link simbólico para / bin / bash.

    Ainda relacionado à portabilidade, deve-se levar em consideração que o caminho indicado no shebang é absoluto, havendo momentos em que os intérpretes são instalados em outros locais. Por exemplo, é comum ter o interpretador python instalado em / usr / local / bin / python se você baixou e compilou o Python em vez de usar um pacote de sua distribuição. Se o seu shebang for #! / Usr / bin / python, o script não funcionará nesses sistemas. Para tentar evitar esses problemas, você pode usar como shebang "#! / Usr / bin / env python" (ou "#! / Usr / bin / env sh") conforme explicado em http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Vamos usar Linux dito

    Obrigado Jonathan! Bom ver seu comentário!
    Felicidades! Paulo.

  18.   antonio dito

    Em nenhum lugar faço o que quero saber, ou pelo menos não sei como levantá-lo no motor de busca, quero criar um script que por um motivo xX execute o comando aptitude ou «su» (é apenas um exemplo mas são os 2 casos em que consigo pensar) e no caso do aptitude às vezes pede-me para introduzir "yon" ou no "su" pede-me a palavra-passe ... Gostaria que o script seleccione essas opções automaticamente passando um parâmetro ou usando algum método que ele não conhece .... muito obrigado pela sua atenção

    1.    vamos usar linux dito

      Olá Antonio! Se o seu problema é ter que digitar a senha, acho que não há solução. Precisamente porque se trata de uma medida de segurança, para que nem todos possam instalar um programa.
      Em relação à aptidão e ter que colocar sim, acho que dá para resolver. Não me lembro neste momento o parâmetro exato a usar, mas apenas descubro nas páginas de manual. Abra um terminal e digite o comando: man aptitude.
      Abraço! Paulo.

  19.   David M. M. dito

    Postagem muito boa.
    Gostei especialmente -neste post- que a pergunta / dúvida que surge seja respondida de forma muito clara e concisa.