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';

Antworten:


24

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


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

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

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 ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.