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

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.


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

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

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 ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.