Aliase im Subshell / Child-Prozess

16

Ich habe Aliase in /etc/profile.d/alias.sh für jede Login-Shell eingerichtet. Aber wenn ich script.sh ausführe, kann ich diesen Alias ​​nicht verwenden. Wie kann ich Alias ​​auch für Subshells oder untergeordnete Prozesse festlegen?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
lisak
quelle

Antworten:

24

Aliase werden nicht vererbt. Deshalb werden sie traditionell eingesetzt bashrcund nicht profile. Beziehen Sie script.shIhre .bashrcstattdessen von Ihrer oder der systemweiten.

jw013
quelle
Mit geerbt meinen Sie, dass beispielsweise exportierte Variablen geerbt werden und der Rest nicht?
Lisak
1
Ich glaube nicht, dass .bashrc hilft ... Wenn Sie diesen Alias ​​dann in einer Subshell verwenden, weiß er es nicht
lisak
bashrc wird für alle interaktiven Nicht-Login-Shells gelesen, weshalb dies funktionieren sollte, da die meisten Shells, die Sie starten, interaktive Nicht-Login-Shells sind und Aliase in Subshells mit()
jw013
Ich wusste nicht über aliasName () Aufruf, danke
lisak
Um ganz klar zu sein, meinte ich Bash alias foo='echo foobar', Enter, (foo)Outputs foobar.
jw013
11

Dies liegt daran, dass /etc/profile.d/ nur von der interaktiven Anmeldeshell verwendet wird. Wird /etc/bash.bashrcjedoch von einer interaktiven Shell ohne Anmeldung verwendet.

Da ich normalerweise einige globale Aliase für das System festlege, habe ich begonnen, /etc/bashrc.deine Datei mit einigen globalen Aliasen zu erstellen :

    HAVE_BASHRC_D=`cat /etc/bash.bashrc | grep -F '/etc/bashrc.d' | wc -l`

    if [ ! -d /etc/bashrc.d ]; then
            mkdir -p /etc/bashrc.d
    fi
    if [ "$HAVE_BASHRC_D" == "0" ]; then
        echo "Setting up bash aliases"
            (cat <<-'EOF'
                                    if [ -d /etc/bashrc.d ]; then
                                      for i in /etc/bashrc.d/*.sh; do
                                        if [ -r $i ]; then
                                          . $i
                                        fi
                                      done
                                      unset i
                                    fi
                            EOF
            ) >> /etc/bash.bashrc

    fi
an uns
quelle
8

Wenn Sie möchten, dass sie an Unterschalen vererbt werden, verwenden Sie stattdessen Funktionen. Diese können in die Umgebung ( export -f) exportiert werden , und für Unterschalen werden dann diese Funktionen definiert.

Also, für eines Ihrer Beispiele:

rmvr() { rm -rv "$@"; }
export -f rmvr

Wenn Sie einige davon haben, stellen Sie diese zuerst für den Export ein:

set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting
Droj
quelle
0

Ähnliche Frage, ich wollte bash "Befehlsmodus" ausführen und Aliase zur Verfügung haben:

bash -i 'alias'tut nichts. Aber ich habe das Flag -i entdeckt, mit dem die interaktiven Setups ausgeführt werden bash -ci 'alias'.

Es scheint, dass Sie Ihre Frage umgehen können, indem Sie die Datei "beschaffen", z.

 bash -ci '. script.sh'

Dann funktionieren Aliase. FWIW ...

Rogerdpack
quelle