Chamar script com ./ ou sh?

Iniciado por andbecker, 15 de Agosto de 2017, 11:51

tópico anterior - próximo tópico

andbecker

Olá, fiz o código abaixo para atualizar meu git corretamente e tudo funciona quando uso "./ck.sh" para chamá-lo, mas quando uso "sh ck.sh" ele reclama de um operador errado na linha 4...
gostaria de entender qual a diferença entre essas formas de chamar o script...
#!/bin/bash

echo "Executando pull da release: $1 [Foram digitados $# parâmetros.]"
if [ "$1" == "" ]; then
echo "Digite como parametro a release atual e se quiser o branch do checkout"
else
git checkout $1
git pull
if [ "$2" == "" ]; then
git checkout luke
else
git checkout $2
fi
git merge $1 -m "merge"
git status
fi

druidaobelix

#1
Essa é uma questão que pode ser interessante.

Os resultados são diferentes porque são coisas diferentes, isto é, não se trata do mesmo interpretador num caso e noutro.

Usar dot slash não é necessariamente a mesma coisa que usar sh

dot slash é bash; sh é dash, são, pois, interpretadores de comandos diferentes.

Bash é GNU Bourne-Again Shell

Dash é Debian Almquist Shell

Por primeiro precisamos melhor entender o que seja o ./ (ponto barra), comumente conhecido como dot slash.

O dot slash é essencialmente a execução *local* de um determinado comando, isto é, se está passando ao sistema operacional a informação de que o arquivo a ser executado está exatamente aqui onde foi chamado e não em algum outro ponto da PATH e isso se deve sobremodo a atender razões de segurança de executáveis.

Para não ter que escrever tudo de novo, numa longa dissertação, remeto ao trabalho desse link onde a questão está sobejamente explicada pelo companheiro Elias Praciano.

Por que precisamos usar ./ antes do nome de um script para executá-lo no Linux?

https://elias.praciano.com/2016/01/por-que-precisamos-usar-antes-do-nome-de-um-script-para-executa-lo-no-linux/

Ainda, faça a verificação da shell padrão do sistema fazendo:

echo $SHELL

que certamente, no Ubuntu, irá resultar em:

/bin/bash

Estabelecido que dot slash é bash e tendo isso em conta, vamos voltar à questão central que é se tratar de interpretadores de comando diferentes.

É ver que sh é na verdade um link simbólico que remete ao dash, confira fazendo:

ls /bin/sh

Depois faça:

file /bin/sh

que irá resultar:

/bin/sh: symbolic link to dash

Bem, o fato está aí, a explicação do fato, que é uma questão histórica, vem depois, quando o relóginho do tempo aqui permitir escrever um pouco mais.  :)

www.arredondar.org.br
Vencedor Desafio de Impacto Social Google 2016!
Você também pode participar e fazer a diferença.

druidaobelix

Retomando o conversê sobre o bash e o dash, pensando melhor, creio que o de mais relevante que poderia ser dito sobre isso de forma mais imediata e ponto inicial para que tenhamos uma base comum de raciocínio está dito nesse Ubunti-Wiki, inclusive apontando soluções para eventuais problemas, nada obstante o fato de estar em inglês, o que inclui o histórico da questão.

DashAsBinSh

https://wiki.ubuntu.com/DashAsBinSh

www.arredondar.org.br
Vencedor Desafio de Impacto Social Google 2016!
Você também pode participar e fazer a diferença.