Псевдоніми в процесі піддошкового / дочірнього процесу


16

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

/etc/profile.d/alias.sh

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

Відповіді:


24

Псевдоніми не передаються у спадок. Ось чому їх традиційно встановлюють, bashrcа ні profile. Натомість отримайте джерело свого script.shз вашого .bashrcабо загальносистемного.


Вказавши, ви маєте на увазі, що, наприклад, експортовані змінні успадковуються, а решта - ні?
lisak

1
Я не думаю, що .bashrc допомагає ... Якщо ви використовуєте цей псевдонім, то в нижній частині, він цього не знає
lisak

bashrc читається для всіх інтерактивних оболонок без входу, тому це повинно працювати, оскільки більшість оболонок, які ви запускаєте, - це інтерактивні не вхідні оболонки, а псевдоніми працюють у ()
підрозділах

Я не знав про виклик aliasName (), дякую
lisak

Просто, щоб було зрозуміло, що я мав на увазі в баш,, alias foo='echo foobar'введіть, (foo)виводить foobar.
jw013

11

Це тому, що /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

8

Якщо ви хочете, щоб вони перейшли у спадок до під оболонок, замість цього використовуйте функції. Вони можуть бути експортовані в навколишнє середовище ( 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.