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!
setupLotsOfThings
. Sie stehen der Funktion selbst einfach nicht zur Verfügung. Sie funktionieren in der Shell, von der aus Sie die Funktion aufgerufen haben. Wie auch immer, wenn Ihre Funktion nur Aliase enthält, warum nicht einfach einen Alias verwenden? Zum Beispiel :alias setupstuff="source aliases.sh"
.Tatsächlich sind Ihre Aliase verfügbar, nachdem die Funktion geladen wurde! Sie können sie in Ihrer interaktiven Shell oder
.bashrc
nach dem Ausführen der Funktion verwenden.Die Einschränkung besteht darin, dass Aliase in einer Funktionsdefinition beim Lesen der Funktionsdefinition erweitert werden, nicht beim Auswerten der Funktion. Dies ist eine Einschränkung von Bash. Das wird also funktionieren:
Aber nicht das:
Wenn Sie Aliase benötigen, die innerhalb von Funktionen verwendet werden können und nach dem Analysieren der Funktion definiert werden können, machen Sie sie stattdessen zu Funktionen. Denken Sie daran, dass Sie mit der
command
integrierten Funktion einen externen Befehl von einer gleichnamigen Funktion aus aufrufen können.quelle