Os scripts de shell são normalmente tratados como se fossem iguais a qualquer outro tipo de arquivo executável, como binários, scripts Python, scripts Perl ou qualquer outro tipo de script. Eles têm um shebang no topo que direciona o kernel a executá-los através do shell. Espera-se que sejam invocados da mesma forma que qualquer outro comando.
Como tal, um novo shell é iniciado toda vez que o script é invocado, e quaisquer configurações como set -f
presentes no shell invocador ou em qualquer outra instância do shell no sistema são irrelevantes.
É claro que é possível que os usuários forneçam seu script em vez de executá-lo, por exemplo, assim:
. /path/to/your/script
ou para executá-lo em um shell que tenha configurações não padrão como esta:
sh -f /path/to/your/script
mas essas não são consideradas formas normais ou invocam o seu script, e os usuários que fazem isso devem esperar o que obtêm como resultado.
Note que existem alguns scripts que se destinam a ser originados, não executados, porque seu propósito é para coisas como alterar as variáveis de ambiente cwd ou setting que devem ser refletidas no ambiente do shell de sourcing, mas estas são em minoria e geralmente é feito como parte de um protocolo acordado. Esses arquivos podem ser considerados mais como "plugins" para qualquer sistema que eles esperem ser originados, não tanto quanto scripts independentes. Por exemplo, arquivos em /etc/rc*.d
com nomes que terminam em .sh
são originados pelo subsistema de script de inicialização, não executados, e está documentado que isso é o que acontecerá se você colocar um arquivo com esse nome em /etc/rc*.d
e quando é feito, é feito de propósito. A convenção de nomear arquivos destinados a serem originados em vez de executados dessa maneira é seguida em outros lugares também, mas não universalmente.
É verdade que os arquivos destinados a serem originados dessa maneira têm que cuidar de quais configurações podem estar presentes no ambiente do chamador que podem afetar o comportamento do shell, mas o protocolo acordado deve idealmente prometer um ambiente de execução previsível.