Eu uso um script (ao qual não tenho acesso de gravação) que cria vários aliases para configurar um ambiente. Gostaria de criar uma função bash para configurar meu ambiente, mas parece que os aliases não sobrevivem ao corpo da função.
Aqui está um exemplo mínimo:
# aliases.sh
alias fooAlias='echo "this will never work!"'
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
.
Agora, se eu simplesmente fonte aliases.sh
interativa, as coisas funcionam como esperado:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
No entanto, se eu chamar a função definida no meu .bashrc, ela não reconhecerá o alias depois de obter sua definição:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
O que está acontecendo aqui? Há algo que está faltando no escopo do alias
comando quando usado em uma função?
Edit: Vou adicionar alguns detalhes além do exemplo mínimo para esclarecer o que estou tentando realizar.
Para o meu trabalho, desenvolvo e executo muitos softwares em um cluster e / ou grade. Tenho vários projetos que exigem ambientes completamente diferentes, como versões diferentes do gcc, versões específicas de software, PATHs de configuração e dados e várias variáveis de ambiente. Os administradores fornecem os scripts para configurar várias coisas, geralmente definindo funções ou aliases do shell, que invocam outras funções ou aliases ou executam vários scripts. Para mim, é uma caixa preta.
Eu gostaria de configurar meus próprios ambientes com um único comando. Atualmente, faço algo como:
[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ $ runSomeOtherSetup # this was defined in the new script
Esses comandos geralmente precisam ser executados em ordem. Minha idéia era basicamente copiar as linhas acima em um bloco de funções, mas, como mostra o exemplo original, isso simplesmente não funciona. Soluções alternativas são mais que bem-vindas!
setupLotsOfThings
, eles simplesmente não estão disponíveis para a função em si. Eles funcionam no shell do qual você chamou a função. De qualquer forma, se sua função apenas originar aliases, por que não usar apenas um alias? Por exemplo:alias setupstuff="source aliases.sh"
.Na verdade, seus apelidos estão disponíveis após o carregamento da função! Você pode usá-los em seu shell interativo ou no seu
.bashrc
após executar a função.A restrição é que os aliases em uma definição de função são expandidos quando a definição da função é lida, não quando a função é avaliada. Essa é uma limitação do bash. Então, isso vai funcionar:
Mas não é isso:
Se você precisar de aliases que possam ser utilizados dentro de funções e que possam ser definidos após a análise da função, faça-os funcionar. Lembre-se de que você pode usar o
command
builtin para chamar um comando externo a partir de uma função com o mesmo nome.fonte