Псевдонимы в подоболочке / дочернем процессе

15

Я установил псевдонимы в /etc/profile.d/alias.sh для каждой оболочки входа в систему. Но если я запускаю script.sh, я не могу использовать этот псевдоним. Как я могу установить псевдоним даже для подоболочек или дочерних процессов?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
Лысак
источник

Ответы:

23

Псевдонимы не наследуются. Вот почему они традиционно установлены, bashrcа не profile. Исходный код своего script.shот вашей .bashrcили общесистемного один вместо этого.

jw013
источник
Под inhereted вы подразумеваете, что, например, экспортируемые переменные наследуются, а остальные нет?
Лисак
1
Я не думаю, что .bashrc помогает ... Если вы используете этот псевдоним тогда в подоболочке, он этого не знает
lisak
bashrc читается для всех интерактивных оболочек без входа в систему, поэтому это должно работать, поскольку большинство запускаемых вами оболочек являются интерактивными оболочками без регистрации, а псевдонимы работают в подоболочках с()
jw013
Я не знал о вызове aliasName (), спасибо
lisak
Просто чтобы было ясно, что я имел в виду в bash alias foo='echo foobar', enter, (foo)output foobar.
jw013
10

Это потому, что /etc/profile.d/ используется только интерактивной оболочкой входа в систему. Тем не менее, /etc/bash.bashrcиспользуется интерактивная оболочка без входа в систему.

Поскольку я обычно устанавливаю некоторые глобальные псевдонимы для системы, я начал создавать, /etc/bashrc.dгде я могу удалить файл с некоторыми глобальными псевдонимами:

    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

Если вы хотите, чтобы они были унаследованы от вложенных оболочек, используйте вместо них функции. Они могут быть экспортированы в environment ( export -f), и тогда в подоболочках эти функции будут определены.

Итак, для одного из ваших примеров:

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

Если у вас их несколько, то сначала установите для экспорта:

set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting
Droj
источник
0

Подобный вопрос, я хотел запустить bash "командный режим" и иметь псевдонимы:

bash -i 'alias'ничего не делает. Но я обнаружил флаг -i, который запускает интерактивные настройки, так что это bash -ci 'alias'работает.

По вашему вопросу, кажется, вы можете обойти его путем "поиска" файла, например:

 bash -ci '. script.sh'

Тогда псевдонимы работают. FWIW ...

rogerdpack
источник