Maneira apropriada de distribuir scripts de shell

7

Qual é a maneira mais adequada de distribuir scripts shell, se os comportamentos dos shells podem ser modificados por set e, portanto, são imprevisíveis?

Por exemplo, rm *.txt não seria executado como esperado nos ambientes em que set -f foi executado. Como devo ter certeza de que rm *.txt remove todos os arquivos de texto em um diretório atual em qualquer ambiente?

Como devo ter certeza de que os scripts de shell serão executados como esperado antes de distribuí-los em geral?

    
por hoge 26.07.2014 / 00:52

1 resposta

6

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.

    
por 26.07.2014 / 01:18