Wie sind Aliase in der Haupt-Shell verfügbar, aber nicht in der Unter-Shell?

Wie sind Aliase in der Haupt-Shell verfügbar, aber nicht in der Unter-Shell?

Ich habe einen Text gelesen, in dem steht:

Die .bashrc-Shell-Konfigurationsdatei wird tatsächlich jedes Mal ausgeführt, wenn Sie eine BASH-Shell generieren, z. B. wenn Sie ein Shell-Skript ausführen. Mit anderen Worten: Jedes Mal, wenn eine Subshell erstellt wird, wird die .bashrc-Datei ausgeführt. Dies hat zur Folge, dass alle lokalen Variablen oder Aliase exportiert werden, die Sie in der .bashrc-Shell-Initialisierungsdatei definiert haben.

Ich habe auch gelesen, dass jedes Mal, wenn ich ein Shell-Skript ausführe (sagen wirscript1.sh), wird eine Unterschale erstellt. Wenn diese Unterschale erstellt wird,.bashrcDatei muss ausgeführt werden und daher Alias(e) definiert in.bashrcmüssen in der Subshell verfügbar sein (was nicht der Fall ist). Und wenn Aliase in dieser Subshell nicht verfügbar sind, wie sind sie dann in der Hauptshell verfügbar (über die ich mein Skript ausführe)?

Antwort1

Richtig, in der Bash-Shell von Linux können Sie sagen

source /path/to/my_lib.sh

zum Laden Ihrer Aliasdefinitionen aus einer Datei. Oder, um die Komplexität zu verringern, können Sie diese Aliasdefinitionen einfach in Ihr Bash-Skript kopieren.

Aber warten Sie! Dies wird nur die Aliase erstellen, wahrscheinlich mit

alias foo3 foo9  # describe these two aliases: declare errors if one doesn't exist

Sie werden Freude an Ihren neuen Aliasdefinitionen haben, aber ihre Ausführung wird fehlschlagen, bevor Sie die Aliaserweiterung mit Folgendem aktivieren:

shopt -s expand_aliases # alias xpn ON

Bedenken Sie auch:

shopt -u expand_aliases # alias xpn OFF

oder

shopt  expand_aliases   # query whether

oder

unalias foo3 foo9 # delete these aliases 

Antwort2

Wenn Sie Aliase definiert haben script1.shund diese überall verfügbar sein sollen, fügen Sie Ihrer .bashrcDatei Folgendes hinzu:

source /path/to/script1.sh

oder alternativ:

. /path/to/script1.sh

Um einen Fehler zu vermeiden, falls das Skript nicht existiert, können Sie Folgendes verwenden:

if [ -f /path/to/script1.sh ]; then source /path/to/script1.sh; fi

Das Gleiche funktioniert für alle Funktionen, die Sie in definieren script1.sh.

verwandte Informationen