bash script.sh vs ./script.sh vs #shebang

2

Assumindo que estou em um bash shell agora e executo o seguinte

[me@server]$ bash script.sh

q1) Um novo processo bash filho é criado para executar o script?

Se eu fizer um

[me@server]$ ./script.sh

q2) Um novo processo bash filho é criado para executar o script?

q3) Qual é a diferença entre os 2 métodos então?

    
por Noob 09.07.2015 / 15:31

2 respostas

0

  1. um processo bash filho é criar
  2. o mesmo que acima (devido à shebang)
  3. os dois são equivalentes, se você não quiser bifurcar um filho ou quiser manter o valor de env de script.sh , use

    . ./script.sh
    

Cuidado, no entanto

  • se script.sh chamar saída, você sairá do shell atual.
  • se o shell terminar sem erro, você retornará ao shell inicial.
por 09.07.2015 / 15:38
0

De explicação de barra de pontos

A diferença que você faz é,

com sh , você está executando um programa que irá interpret the lines in your script exatamente como você teria digitado no prompt interativo do terminal,

com ./ você está fazendo um atalho supondo que o script está bem aqui no diretório atual em que você está sentado E será executável (porque, por exemplo, você emitiu chmod + x myscript.sh),

Informações adicionais de esta resposta:

For your specific script either way will work, except that ./script.sh requires execution and readable bits, while bash script.sh only requires readable bit.

The reason of the permissions requirement difference lies in how the program that interprets your script is loaded:

./script.sh makes your shell run the file as if it was a regular executable. The shell forks itself and uses a system call (e.g. execve) to make the operating system execute the file in the forked process. The operating system will check the file's permissions (hence the execution bit needs to be set) and forward the request to the program loader, which looks at the file and determines how to execute it. In Linux compiled executables start with an ELF magic number, while scripts start with a #! (hashbang). A hashbang header means that the file is a script and needs to be interpreted by the program that is specified after the hashbang. This allows a script itself to tell the system how to interpret the script.

With your script, the program loader will execute /bin/bash and pass ./script.sh as the command-line argument.

bash script.sh makes your shell run bash and pass script.sh as the command-line argument So the operating system will load bash (not even looking at script.sh, because it's just a command-line argument). The created bash process will then interpret the script.sh because it's passed as the command-line argument. Because script.sh is only read by bash as a regular file, the execution bit is not required.

    
por 09.07.2015 / 15:43