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


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или общесистемного один вместо этого.


Под 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

0

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

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

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

 bash -ci '. script.sh'

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.