Używam skryptu (do którego nie mam uprawnień do zapisu), który tworzy kilka aliasów do skonfigurowania środowiska. Chciałbym utworzyć funkcję bash, aby skonfigurować środowisko, ale wygląda na to, że aliasy nie przetrwają w ciele funkcji.
Oto minimalny przykład:
# aliases.sh
alias fooAlias='echo "this will never work!"'
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
.
Teraz, jeśli po prostu źródle aliases.sh
interaktywnie, rzeczy działają zgodnie z oczekiwaniami:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Jednak jeśli wywołam funkcję zdefiniowaną w moim .bashrc, nie rozpozna aliasu po uzyskaniu jego definicji:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
Co tu się dzieje? Czy brakuje mi czegoś w zakresie alias
polecenia, gdy jest ono używane w funkcji?
Edycja: Dodam kilka szczegółów poza minimalny przykład, aby rzucić nieco światła na to, co próbuję osiągnąć.
Do mojej pracy opracowuję i uruchamiam wiele programów w klastrze i / lub sieci. Mam kilka projektów, które wymagają zupełnie różnych środowisk, takich jak różne wersje gcc, określone wydania oprogramowania, ścieżki konfiguracji i danych oraz różne zmienne środowiskowe. Administratorzy zapewniają skrypty do konfigurowania różnych rzeczy, zwykle poprzez zdefiniowanie funkcji powłoki lub aliasów, które wywołują inne funkcje lub aliasy lub uruchamiają różne skrypty. Dla mnie to czarna skrzynka.
Chciałbym skonfigurować własne środowiska za pomocą jednego polecenia. Obecnie robię coś takiego:
[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
Te komendy na ogół muszą być uruchamiane w kolejności. Moim pomysłem było po prostu skopiowanie powyższych linii do bloku funkcyjnego, ale jak pokazuje oryginalny przykład, to po prostu nie działa. Alternatywne obejścia są mile widziane!