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