Почему псевдонимы доступны в основной оболочке, но не в дочерней?

Почему псевдонимы доступны в основной оболочке, но не в дочерней?

Я читал какой-то текст, и там говорилось:

Файл конфигурации оболочки .bashrc фактически выполняется каждый раз, когда вы генерируете оболочку BASH, например, когда вы запускаете скрипт оболочки. Другими словами, каждый раз, когда создается подоболочка, выполняется файл .bashrc. Это приводит к экспорту любых локальных переменных или псевдонимов, которые вы определили в файле инициализации оболочки .bashrc.

Я также читал, что каждый раз, когда я запускаю скрипт оболочки (скажем,скрипт1.sh), создается подоболочка. Поэтому, когда создается эта подоболочка,.bashrcфайл должен быть выполнен и, таким образом, псевдонимы определены в.bashrcдолжны быть доступны в подоболочке (которых нет). И если псевдонимы не доступны в этой подоболочке, то как они доступны в основной оболочке (через которую я выполняю свой скрипт)?

решение1

Правильно, в оболочке bash Linux вы можете сказать:

source /path/to/my_lib.sh

для загрузки ваших алиасов defs из файла. Или, для снижения сложности, вы можете просто скопировать эти алиасы defs в ваш скрипт bash.

Но подождите! Это создаст только псевдонимы, вероятно, с

alias foo3 foo9  # describe these two aliases: declare errors if one doesn't exist

Вам понравятся ваши новые определения псевдонимов, но их запуск завершится ошибкой, пока вы не включите расширение псевдонимов с помощью:

shopt -s expand_aliases # alias xpn ON

Также рассмотрите:

shopt -u expand_aliases # alias xpn OFF

или

shopt  expand_aliases   # query whether

или

unalias foo3 foo9 # delete these aliases 

решение2

Если вы определили псевдонимы script1.shи хотите, чтобы они были доступны везде, добавьте в свой .bashrcфайл:

source /path/to/script1.sh

или альтернативно:

. /path/to/script1.sh

Чтобы избежать ошибки в случае отсутствия скрипта, можно использовать:

if [ -f /path/to/script1.sh ]; then source /path/to/script1.sh; fi

То же самое работает для любых функций, которые вы определяете в script1.sh.

Связанный контент