Chamando um script com ./bla.sh vs. bla.sh

11

Alguém pode me explicar o que a casca faz nos dois exemplos A) e B) abaixo? Obviamente se comporta de maneira diferente, mas não consigo descobrir por que a saída é diferente.

Exemplo:
Vamos ter um script em nosso diretório atual chamado bla.sh com apenas um comando:
echo ${0##/*} hello

A)
Começou como: ./bla.sh
dá: ./bla.sh hello

B)
Começou como: . bla.sh
dá: -bash hello

Como eu uso isso em um script, a segunda saída (por causa do "-" na frente do -bash) mata o comando. Claro, um simples -- antes do ${...} ajudou, mas eu adoraria entender o que causa a saída em primeiro lugar.
Eu amo bash. E vi [m]. Mas eu divago ...

    
por Wolf 13.09.2009 / 13:05

3 respostas

22
./bla.sh

Aqui, o comando é ./bla.sh . Isso faz com que o shell procure por um executável chamado bla.sh no diretório atual e, em seguida, peça ao kernel para executá-lo como um programa normal, em um processo separado do shell. (Não importa se bla.sh é um script bash , um perl ou python one ou um binário compilado.)

. bla.sh

Aqui, o comando é . (também conhecido como source ), um comando interno do seu shell. Faz o shell procurar por um arquivo chamado bla.sh no caminho do sistema ($ PATH) e interpretar o conteúdo como se ele fosse digitado por você; Tudo isso é feito no mesmo processo como o próprio shell (e, portanto, pode afetar o estado interno do shell).

Isso, é claro, só funciona quando bla.sh contém comandos para o bash shell (se esse é o que você está usando atualmente), não funcionará para perl scripts ou qualquer outra coisa.

(Isso é explicado em help . e help source também.)

Como . e ./ são coisas completamente diferentes (um comando versus parte de um caminho), eles podem ser combinados, é claro - usar . ./bla.sh iria "originar" um arquivo bla.sh no diretório atual .

Normalmente, é melhor usar o método ./bla.sh . Somente ~/.bashrc , ~/.profile e tais arquivos são geralmente originados, porque eles devem modificar o ambiente atual.

    
por 13.09.2009 / 13:24
7

./<cmd> executará o programa <cmd> que reside no diretório atual em um novo processo (bifurcado). Tem que ser executável. E também legível, começa com #! .

. <cmd> fará seu shell atual executar o script de shell <cmd> que reside no seu $PATH ou no diretório atual no processo do shell atual . Tem que ser legível. É um alias para o comando shell source .

    
por 21.12.2012 / 14:25
1

./cmd usa o caminho explícito ( ./ - current dir) para o executável. E não é necessário que comece com #! .

. cmd - (aka source ) - comando bash incorporado. Uma diferença visível da execução através de source é que ela pode definir / modificar a variável de ambiente do shell atual.

    
por 21.12.2012 / 17:50