Existe diferença entre o script ./script e bash? [duplicado]

3

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?

    
por wchargin 11.11.2013 / 16:39

4 respostas

8

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.

    
por 11.11.2013 / 17:11
4

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.

    
por 11.11.2013 / 20:07
-2

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.

    
por 11.11.2013 / 17:35
-2

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.

    
por 14.12.2014 / 19:28