Os scripts geralmente começam com um shebang como #!/usr/bin/env bash
, que especifica o shell a ser usado para execução. O comportamento de execução quando o shebang não está presente parece depender do shell de chamada . De qualquer forma, o script é executado a partir de um "novo" shell que não conhece as variáveis e funções definidas no shell de chamada.
Como alternativa, os scripts também podem ser source
inseridos em um shell, o que, pelo que entendi, é equivalente a copiar e colar o conteúdo do script no shell atual. Se quaisquer funções ou variáveis forem definidas no script, elas permanecerão no shell de chamada após a "execução", o que pode não ser desejável.
Existe algo entre essas duas opções? É possível executar um script como um subshell do shell de chamada, de modo que tenhamos acesso a tudo definido no shell de chamada, mas não o modifiquemos (a menos que talvez com e tais comandos) export
?
Escrever (source myscript.sh)
parece estar fazendo o que procuro; esta é a maneira certa de fazer isso? Existe um shebang equivalente que produziria o mesmo comportamento chamando ./myscript.sh
em vez disso?
é o caminho certo ( o formulário padrão é
.
, nãosource
, e.
sem diretório especificado pesquisas noPATH
).Mesmo se fosse possível escrever um shebang referindo-se ao shell pai, por exemplo , se houvesse um
/proc/parent
apontamento para o pai (semelhante a/proc/self
), não seria confiável porque o shell pai pode não existir mais no disco! Por exemplo, se um script for iniciado e o shell em execução for atualizado, o shell específico usado pelo script será substituído.POSIX (IEEE Std 1003.1-2017, Seção 2.12) especifica:
Portanto, você está certo de que um subshell teria acesso a tudo no shell de chamada, mas incorreto sobre comandos como a
export
capacidade de modificar o ambiente do shell pai.E, claro, o formato também é especificado pelo POSIX da seguinte forma:
Supondo que você tenha um shebang presente em seu script. Ele será executado usando qualquer interpretador que você especificou (por exemplo, bash), mas como um processo separado , em vez de um subshell . Mas isso ainda alcançaria o resultado desejado de ter um script em execução que não modificaria o ambiente de shells pai.
Nota: O
.
comando dot é equivalente asource
.Atualização : Esqueci de abordar o fato de que a execução como um script não exportaria nenhuma variável de ambiente, a menos que a
set -a
opção fosse definida. No entanto, lembre-se de que apenas as variáveis atribuídas após a ativação da opção serão exportadas. Se isso não é algo que você deseja, então sua melhor aposta seria em(. script.sh)
Do manual: