Aliasy w procesie podpowłoki / procesu potomnego

16

Skonfigurowałem aliasy w /etc/profile.d/alias.sh dla każdej powłoki logowania. Ale jeśli uruchomię skrypt.sh, nie będę mógł użyć tego aliasu. Jak ustawić alias nawet dla podpowłoki lub procesów potomnych?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
lisak
źródło

Odpowiedzi:

24

Aliasy nie są dziedziczone. Dlatego są tradycyjnie osadzone bashrci nie profile. Źródłowego script.shz listy .bashrclub całego systemu, a nie jeden.

jw013
źródło
Przez dziedziczone rozumiesz, że na przykład zmienne eksportowane są dziedziczone, a reszta nie?
lisak,
1
Nie sądzę, że .bashrc pomaga ... Jeśli następnie użyć tego aliasu w podpowłoce, że nie wie
Lisak
bashrc odczytywana jest dla wszystkich powłok interaktywnych bez logowania, dlatego to powinno działać, ponieważ większość muszli uruchomieniu są interaktywne muszle bez logowania i aliasy wykonywać pracę w podpowłok z()
jw013
Nie wiedziałem o wywołaniu aliasName (), dziękuję
lisak
Żeby było jasne, miałem na myśli bash alias foo='echo foobar', enter, (foo)wyjścia foobar.
jw013,
11

Jest tak, ponieważ /etc/profile.d/ jest używany tylko przez interaktywną powłokę logowania. Jest jednak /etc/bash.bashrcużywany przez interaktywną powłokę niezalogowaną.

Ponieważ zwykle ustawiam niektóre globalne aliasy dla systemu, zacząłem tworzyć miejsca, w /etc/bashrc.dktórych mogę upuścić plik z kilkoma globalnymi aliasami:

    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
na nas
źródło
8

Jeśli chcesz, aby były dziedziczone w podpowłokach, użyj zamiast nich funkcji. Można je wyeksportować do środowiska ( export -f), a następnie podpowłoki będą miały zdefiniowane funkcje.

Tak więc dla jednego z twoich przykładów:

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

Jeśli masz ich kilka, najpierw ustaw na eksport:

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

Podobne pytanie, chciałem uruchomić bash „tryb poleceń” i mieć dostępne aliasy:

bash -i 'alias'nic nie robi. Ale odkryłem flagę -i, która uruchamia konfiguracje interaktywne, więc to: bash -ci 'alias'działa.

Wygląda na to, że w przypadku pytania można go obejść, „pozyskując” plik, np .:

 bash -ci '. script.sh'

Następnie działają aliasy. FWIW ...

rogerdpack
źródło