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

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.

jw013
fuente
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
a nosotros
fuente
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
Droj
fuente
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 ...

rogerdpack
fuente