Operador de origem ou ponto que sobrescreve a permissão de execução?

5

Se eu tiver desativado as permissões de execução em hello.sh e tente executá-lo

~$ sudo chmod 0666 hello.sh
~$ ./hello.sh
-bash: ./hello.sh: Permission denied

Eu recebo o erro de permissão. Mas eu posso facilmente substituir isso usando o . ou source construído.

$ . hello.sh
hello everyone

Qual é o propósito de definir a permissão de execução em um arquivo se alguém puder substituí-lo usando o source builtin?

hello.sh

#!/bin/bash
echo 'hello everyone'
    
por user784637 02.09.2012 / 22:21

2 respostas

6

Há uma diferença: se você executar o script como ./script.sh , estará criando um novo processo, uma nova instância do shell bash. Isso é negado.

No entanto, como as permissões permitem que você leia o script, o que há para impedi-lo de copiar e colar todo o conteúdo? O source build-in faz apenas isso: ele executa os comandos um por um, lendo-os a partir de um arquivo de texto.

    
por January 02.09.2012 / 22:25
4

Quando você executa ./hello.sh , você diz ao kernel para executar o programa hello.sh . Se você tem permissão de execução, então o kernel lê os primeiros bytes do arquivo, vê o #! line para que ele saiba que este é um script e executa o interpretador ( /bin/bash ), passando o nome do script como seu primeiro argumento. Então o bash trata o arquivo como uma série de instruções. Se você não tem permissão de execução, o kernel aborta a execução na primeira etapa.

Quando você executa . hello.sh ou source hello.sh , não está pedindo ao kernel para executar hello.sh . Você está pedindo bash para ler o arquivo hello.sh e interpretá-lo como uma série de instruções.

É a mesma coisa se você executar bash hello.sh , a propósito: você não está executando hello.sh , você está interpretando isso por bash (que está sendo executado). Veja Executando um script em permissões do arquivo zsh .

    
por Gilles 03.09.2012 / 01:11