Os scripts são executados em subshells. Eles não podem afetar o ambiente da sua sessão de shell ativa da maneira que as funções podem. Veja, por exemplo, o avançada Guia de Bash-Scripting, capítulo 21: subshells :
A subshell is a separate instance of the command processor -- the shell that gives you the prompt at the console or in an xterm window. Just as your commands are interpreted at the command-line prompt, similarly does a script batch-process a list of commands. Each shell script running is, in effect, a subprocess (child process) of the parent shell.
Ou o Bash Referência, Seção 3.8: Scripts Shell :
A shell script may be made executable by using the chmod command to turn on the execute bit. When Bash finds such a file while searching the
$PATH
for a command, it spawns a subshell to execute it. In other words, executing
filename arguments
is equivalent to executing
bash filename arguments
if
filename
is an executable shell script. This subshell reinitializes itself, so that the effect is as if a new shell had been invoked to interpret the script, with the exception that the locations of commands remembered by the parent (see the description ofhash
in Bourne Shell Builtins) are retained by the child.
Se você quiser usar um script em vez de uma função, pode source
em vez de executá-lo, mas honestamente eu acho que provavelmente é melhor ficar apenas usando funções (ou aliases) para o tipo de coisa que você está fazendo.
Desse modo, se você quiser reorganizar o código em ~/.bashrc
, poderá separá-lo em arquivos separados e, em seguida, source
desses arquivos em ~/.bashrc
, por exemplo, você pode colocá-los em um subdiretório local, como ~/.bashrc.d
.