Ich verwende ein Skript (auf das ich keinen Schreibzugriff habe), das eine Reihe von Aliasen erstellt, um eine Umgebung einzurichten. Ich möchte eine Bash-Funktion erstellen, um meine Umgebung einzurichten, aber es scheint, dass die Aliase für den Funktionskörper nicht überleben.
Hier ist ein minimales Beispiel:
# aliases.sh
alias fooAlias='echo "this will never work!"'
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
.
Wenn ich jetzt einfach aliases.sh
interaktiv beschaffe, funktionieren die Dinge wie erwartet:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Wenn ich jedoch stattdessen die in meiner .bashrc definierte Funktion aufrufe, erkennt sie den Alias nach der Beschaffung ihrer Definition nicht:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
Was geht hier vor sich? Fehlt mir etwas am Umfang des alias
Befehls, wenn er in einer Funktion verwendet wird?
Bearbeiten: Ich werde einige Details hinzufügen, die über das minimale Beispiel hinausgehen, um etwas Licht auf das zu werfen, was ich erreichen möchte.
Für meine Arbeit entwickle und starte ich viel Software in einem Cluster und / oder Grid. Ich habe mehrere Projekte, die völlig unterschiedliche Umgebungen erfordern, wie z. B. unterschiedliche gcc-Versionen, bestimmte Softwareversionen, Konfigurations- und Datenpfade sowie verschiedene Umgebungsvariablen. Administratoren stellen die Skripte zum Einrichten verschiedener Dinge bereit, normalerweise durch Definieren von Shell-Funktionen oder Aliasnamen, die andere Funktionen oder Aliase aufrufen oder verschiedene Skripts ausführen. Für mich ist es eine Black Box.
Ich möchte meine eigenen verschiedenen Umgebungen mit einem einzigen Befehl einrichten. Derzeit mache ich so etwas wie:
[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
Diese Befehle müssen im Allgemeinen der Reihe nach ausgeführt werden. Meine Idee war im Grunde, nur die obigen Zeilen in einen Funktionsblock zu kopieren, aber wie das ursprüngliche Beispiel zeigt, funktioniert das einfach nicht. Alternative Problemumgehungen sind mehr als willkommen!