Uma solução alternativa é colar esses comandos em um arquivo de texto em vez de um bloco de função. Algo como:
## This is needed to make the sourced aliases available
## within the script.
shopt -s expand_aliases
source /some/environment/setup/script.sh
aliasToSetupSomeSoftwareVersion
anotherAliasForOtherSoftware
source /maybe/theres/another/script.sh
runSomeOtherSetup
Guarde isso como setup1.sh
de onde quiser. O truque é então fornecer este arquivo, não executá-lo:
$ source setup1.sh
Isso executará os aliases que estão no script e também os disponibilizará ao seu shell atual.
Você pode simplificar ainda mais o processo adicionando isso ao seu .bashrc
:
alias setupLotsOfThings="source setup1.sh"
Agora você pode simplesmente executar setupLotsOfThings
e obter o comportamento desejado da função.
Explicação
Existem dois problemas aqui. Primeiro, os aliases não estão disponíveis para a função em que são declarados, mas apenas quando essa função é encerrada e segundo, quando os aliases não estão disponíveis nos scripts. Ambos são explicados na mesma seção de man bash
:
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS below).
The rules concerning the definition and use of aliases are somewhat confusing. Bash always reads at least one complete line of input before executing any of the commands on that line. Aliases are expanded when a command is read, not when it is executed. Therefore, an alias definition appearing on the same line as another command does not take effect until the next line of input is read. The commands following the alias definition on that line are not affected by the new alias. This behavior is also an issue when functions are executed. Aliases are expanded when a function definition is read, not when the function is executed, because a function definition is itself a compound command. As a consequence, aliases defined in a function are not
available until after that function is executed. To be safe, always put alias definitions on a separate line, and do not use alias in com‐ pound commands.
Depois, há a diferença entre executar e terceirizar um arquivo. Basicamente, a execução de um script faz com que ele seja executado em um shell separado, enquanto o sourcing faz com que ele seja executado no shell atual. Portanto, o fornecimento de setup.sh
torna os aliases disponíveis para o shell pai durante a execução como um script não faria.