Alias ​​nel processo subshell / figlio


15

Ho impostato gli alias in /etc/profile.d/alias.sh per ogni shell di login. Ma se eseguo script.sh, non posso usare quell'alias. Come posso impostare l'alias anche per i subshells o i processi figlio?

/etc/profile.d/alias.sh

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

Risposte:


23

Gli alias non sono ereditati. Ecco perché sono tradizionalmente ambientati bashrce non profile. Trova invece il tuo script.shdal tuo .bashrco da tutto il sistema.


Con ereditato, vuoi dire che ad esempio le variabili esportate sono ereditate e il resto no?
lisak,

1
Non penso che .bashrc aiuti ... Se usi quell'alias in una subshell, non lo sa
lisak

bashrc viene letto per tutte le shell interattive non di accesso, motivo per cui questo dovrebbe funzionare poiché la maggior parte delle shell che si avvia sono shell interattive non di accesso e gli alias funzionano in subshells con()
jw013

Non sapevo dell'invocazione di aliasName (), grazie
lisak il

Giusto per essere chiari, intendevo dire bash,, alias foo='echo foobar'enter, (foo)output foobar.
jw013,

10

È perché /etc/profile.d/ è utilizzato solo dalla shell di login interattiva. Tuttavia, /etc/bash.bashrcviene utilizzato dalla shell interattiva non di accesso.

Come di solito imposto alcuni alias globali per il sistema, ho iniziato a creare /etc/bashrc.ddove posso rilasciare un file con alcuni alias globali:

    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

7

Se vuoi che siano ereditati da sotto-shell, usa invece le funzioni. Questi possono essere esportati nell'ambiente ( export -f) e le sotto-shell avranno quindi quelle funzioni definite.

Quindi, per uno dei tuoi esempi:

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

Se ne hai un sacco, quindi imposta prima l'esportazione:

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

0

Domanda simile, volevo eseguire bash "mode mode" e avere alias disponibili:

bash -i 'alias'non fa nulla. Ma ho scoperto il flag -i che esegue le impostazioni interattive, quindi questo: bash -ci 'alias'funziona.

Per la tua domanda, sembra che tu possa in qualche modo aggirarlo "acquistando" il file, es:

 bash -ci '. script.sh'

Quindi gli alias funzionano. FWIW ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.