Alias ​​dans le processus sous-shell / enfant

15

J'ai configuré des alias dans /etc/profile.d/alias.sh pour chaque shell de connexion. Mais si je lance script.sh, je ne peux pas utiliser cet alias. Comment puis-je définir un alias même pour les sous-coquilles ou les processus enfants?

/etc/profile.d/alias.sh

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

Réponses:

23

Les alias ne sont pas hérités. C'est pourquoi ils sont traditionnellement installés bashrcet non profile. Procurez-vous votre source à script.shpartir de votre ordinateur .bashrcou de l'ensemble du système.

jw013
la source
Par hérité, vous voulez dire que, par exemple, les variables exportées sont héritées et que le reste ne l'est pas?
lisak
1
Je ne pense pas que .bashrc aide ... Si vous utilisez cet alias dans un sous-shell, il ne le sait pas
lisak
bashrc est lu pour tous les shells interactifs sans connexion, c'est pourquoi cela devrait fonctionner puisque la plupart des shells que vous démarrez sont des shells interactifs sans connexion, et les alias fonctionnent en sous()
shells
Je ne connaissais pas l'invocation d'aliasName (), merci
lisak
Juste pour être clair, ce que je voulais dire, c'était bash,, alias foo='echo foobar'enter, (foo)outputs foobar.
jw013
10

C'est parce que /etc/profile.d/ est utilisé uniquement par le shell de connexion interactif. Cependant, /etc/bash.bashrcest utilisé par un shell interactif sans connexion.

Comme j'ai l'habitude de définir des alias globaux pour le système, j'ai commencé à créer /etc/bashrc.doù je peux déposer un fichier avec des alias globaux:

    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
à nous
la source
7

Si vous voulez qu'ils soient hérités des sous-shells, utilisez plutôt des fonctions. Ceux-ci peuvent être exportés vers l'environnement ( export -f), et les sous-shells auront alors ces fonctions définies.

Donc, pour l'un de vos exemples:

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

Si vous en avez plusieurs, définissez d'abord l'exportation:

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

Question similaire, je voulais exécuter bash "mode de commande" et avoir des alias disponibles:

bash -i 'alias'ne fait rien. Mais j'ai découvert le drapeau -i qui exécute les configurations interactives, donc ceci: bash -ci 'alias'fonctionne.

Pour votre question, il semble que vous pouvez le contourner en "approvisionnant" le fichier, par exemple:

 bash -ci '. script.sh'

Ensuite, les alias fonctionnent. FWIW ...

rogerdpack
la source