Depende do seu $PATH
. ./script
será executado em /bin/bash script
. bash script
usará o que for que bash
vem primeiro em seu caminho, o que não é necessariamente /bin/bash
, e pode ser uma versão diferente do Bash.
Dado um arquivo de script de shell que começa como
#!/bin/bash
# (bash script here),
e foi chmod +x
ed, existe alguma diferença na execução de ./script
e bash script
da linha de comando?
Existem duas diferenças:
./tryit.sh
não será executado se bash não estiver localizado em /bin
, mas bash tryit.sh
será executado se bash estiver em qualquer lugar em PATH
. Isso ocorre porque ./tryit.sh
usará o shell do caminho de estrondo ( /bin/bash
), mas bash tryit.sh
usará o primeiro bash
shell no PATH
. ./tryit.sh
não será executado se o bit de execução não estiver definido, mas bash tryit.sh
executará o script. Você excluiu este caso especificando que o bit foi definido. Algumas edições podem limpar o bit, fazendo com que um comando de trabalho comece a falhar. O comando bash tryit.sh
invoca o bash dizendo que os comandos a serem executados estão no arquivo tryit.sh
. Muitos programas, como o awk, o perl, o python, o bash, sh, ksh, funcionam dessa maneira. Este é um idom padrão para programas Unix que processam arquivos de comando.
Eles são sutilmente diferentes e fáceis de cometer erros.
O que você deve usar (que vou escrever em duas formas)
./script
bash ./script
Meu raciocínio é que isso é explícito, caso você tenha alterado o diretório.
formulários não explícitos
script
bash script
São menos seguros. bash script
pesquisará o diretório atual e, em seguida, os diretórios na variável de ambiente PATH, script
por si só é pesquisado apenas nos diretórios PATH. Executar um comando diferente do pretendido poderia prejudicar seus arquivos.
Se bem me lembro do topo da minha cabeça, os dois seguintes são idênticos:
$ ./script
e
$ source script
Portanto, usar o comando ./
"irá, de fato, invocar source
sob o capô , que por sua vez é um comando bash
builtin. Ou, em outra interpretação, eles podem ser chamados de aliases um do outro.
No entanto : a primeira invocação exige que você, o usuário, defina o sinalizador +x
(= executable) com chmod
para proprietário ou grupo, caso contrário, você receberá um erro de "permissão negada". a execução usando o comando source
é mesmo possível sem o sinalizador +x
. Então, o último às vezes será seu salva-vidas sempre que você quiser executar um script bash
em um pendrive formatado em NTFS, por exemplo, pois chmod
não pode trabalhar lá.
Eu penso que responderá a sua pergunta também de alguma forma.
Porque, por esse motivo, bash script
e source script
não podem ser exatamente iguais; o que está chamando o programa bash
com seu script dado como parâmetro, enquanto o outro está chamando um dos comandos builtin do bash
com seu script como um parâmetro.
Embora o resultado provavelmente seja o mesmo (pelo menos no uso diário), as maneiras de chegar lá são um pouco diferentes em ambos os casos.
Tags command-line bash scripting