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!
setupLotsOfThings
, po prostu nie są dostępne dla samej funkcji. Działają w powłoce, z której wywołałeś funkcję. W każdym razie, jeśli twoja funkcja pozyskuje tylko aliasy, dlaczego po prostu nie użyć aliasu? Na przykład:alias setupstuff="source aliases.sh"
.W rzeczywistości twoje aliasy są dostępne po załadowaniu funkcji! Możesz użyć ich w interaktywnej powłoce lub
.bashrc
po uruchomieniu funkcji.Ograniczeniem jest to, że aliasy w definicji funkcji są rozszerzane, gdy definicja funkcji jest czytana, a nie podczas oceny funkcji. To ograniczenie bashu. To zadziała:
Ale nie to:
Jeśli potrzebujesz aliasów, które są użyteczne w funkcjach i które można zdefiniować po sparsowaniu funkcji, ustaw je zamiast nich. Pamiętaj, że możesz użyć
command
wbudowanego polecenia, aby wywołać zewnętrzne polecenie z funkcji o tej samej nazwie.źródło