Aliases no processo subshell / filho


15

Configurei aliases no /etc/profile.d/alias.sh para cada shell de login. Mas se eu executar o script.sh, não posso usar esse alias. Como definir alias mesmo para subshells ou processos filhos?

/etc/profile.d/alias.sh

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

Respostas:


23

Aliases não são herdados. É por isso que eles são tradicionalmente instalados bashrce não profile. Faça a sua origem script.shno seu .bashrcou em todo o sistema.


Por herdado, você quer dizer que, por exemplo, variáveis ​​exportadas são herdadas e o resto não é?
lisak

1
Eu não acho que .bashrc ajuda ... Se você usar esse alias, em seguida, em um subnível, não conhecemos
lisak

bashrc é lido para todas as conchas não-login interativo que é por isso deve funcionar desde que a maioria conchas você iniciar são conchas não-login interativo, e aliases fazer o trabalho em subshells com()
jw013

Eu não sabia sobre a invocação de aliasName (), obrigado
lisak

Só para ficar claro, o que eu quis dizer foi com bash alias foo='echo foobar', enter, (foo)outputs foobar.
Jw013

10

Isso ocorre porque o /etc/profile.d/ é usado apenas pelo shell de login interativo. No entanto, /etc/bash.bashrcé usado pelo shell interativo sem logon.

Como geralmente defino alguns aliases globais para o sistema, comecei a criar /etc/bashrc.donde posso soltar um arquivo com alguns aliases globais:

    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 você deseja que eles sejam herdados para subcascas, use as funções. Esses podem ser exportados para o ambiente ( export -f), e os sub-shells terão essas funções definidas.

Então, para um de seus exemplos:

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

Se você tiver vários deles, defina primeiro a exportação:

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

0

Pergunta semelhante, eu queria executar bash "modo de comando" e ter aliases disponíveis:

bash -i 'alias'faz nada. Mas eu descobri o sinalizador -i, que executa as configurações interativas, então isso: bash -ci 'alias'funciona.

Para sua pergunta, parece que você pode contorná-la "procurando" o arquivo, por exemplo:

 bash -ci '. script.sh'

Os aliases funcionam. FWIW ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.