Alias ​​en subshell / proceso hijo


15

Configuré alias en /etc/profile.d/alias.sh para cada shell de inicio de sesión. Pero si ejecuto script.sh, no puedo usar ese alias. ¿Cómo puedo establecer un alias incluso para subcapas o procesos secundarios?

/etc/profile.d/alias.sh

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

Respuestas:


23

Los alias no se heredan. Es por eso que tradicionalmente se instalan bashrcy no profile. Fuente de su script.shde su .bashrco el sistema de ancho en su lugar.


Por inherente, ¿quiere decir que, por ejemplo, las variables exportadas se heredan y el resto no?
lisak

1
No creo que .bashrc ayude ... Si usas ese alias en una subshell, no lo sabe
Lisak

bashrc se lee para todos los shells interactivos sin inicio de sesión, por lo que esto debería funcionar ya que la mayoría de los shells que inicia son shells interactivos sin inicio de sesión, y los alias funcionan en subshells con()
jw013

Yo no sabía nada de aliasName () invocación, gracias
Lisak

Para ser claros, lo que quise decir fue en bash alias foo='echo foobar', enter, (foo)salidas foobar.
jw013

10

Esto se debe a que /etc/profile.d/ solo lo utiliza el shell de inicio de sesión interactivo. Sin embargo, /etc/bash.bashrces utilizado por el shell interactivo sin inicio de sesión.

Como generalmente establezco algunos alias globales para el sistema, he comenzado a crear /etc/bashrc.ddonde puedo soltar un archivo con algunos alias globales:

    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

Si desea que se hereden a subcapas, utilice funciones en su lugar. Esos se pueden exportar al entorno ( export -f), y las subcapas tendrán definidas esas funciones.

Entonces, para uno de tus ejemplos:

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

Si tiene un montón de ellos, configure primero la exportación:

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

0

Pregunta similar, quería ejecutar bash "modo de comando" y tener alias disponibles:

bash -i 'alias'no hace nada. Pero descubrí el indicador -i que ejecuta las configuraciones interactivas, así que esto: bash -ci 'alias'funciona.

Para su pregunta, parece que puede eludirla "abasteciendo" el archivo, por ejemplo:

 bash -ci '. script.sh'

Entonces los alias funcionan. FWIW ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.