При использовании скрипта с source
или .
содержимое скрипта выполняется в текущей среде оболочки. Любые функции, определенные в исходном сценарии, будут доступны в текущей оболочке после получения, а также любые переменные оболочки (без необходимости экспорта ). Это цель получения сценария.
Вот как файл /etc/profile
или /etc/bash.bashrc
может настроить базовую среду, например, для интерактивной оболочки/оболочки входа в систему.
Кроме того, некоторые команды выполняются в среде подоболочки, которая является дубликатом среды оболочки. В такой среде доступны переменные оболочки и функции. См. также стандарт POSIX о Shell Execution Environment(мой акцент):
A subshell environment shall be created as a duplicate of the shell environment, except that signal traps that are not being ignored shall be set to the default action. Changes made to the subshell environment shall not affect the shell environment. Command substitution, commands that are grouped with parentheses, and asynchronous lists shall be executed in a subshell environment. Additionally, each command of a multi-command pipeline is in a subshell environment; as an extension, however, any or all commands in a pipeline may be executed in the current environment. All other commands shall be executed in the current shell environment.
Обратите внимание, что подоболочка отличается от дочернего процесса.
Экспорт переменной необходим только для создания переменной среды. Переменные среды наследуются любым дочерним процессом.
Также обратите внимание, что наличие каталога с именем ~/.bash_profile
немного сбивает с толку, так как оболочка bash
попытается найти источник обычный файл~/.bash_profile
при запуске оболочки входа в систему. Я предлагаю вам переименовать ваш каталог ~/.bash_profile
во что-то вроде ~/.shell
или ~/.shell_startup
, если вы хотите переместить файлы инициализации оболочки в другое место.Эти файлы по-прежнему должны вызываться из ~/.bash_profile
и ~/.bashrc
, если вы хотите, чтобы они были получены автоматически.
В bash
вы можете выполнить проверку подстановки, используя
if [[ $var == *.awk ]]; then
echo '$var ends with ".awk"'
else
echo '$var does not end with ".awk"'
fi
Обратите внимание на двойные квадратные скобки и знаки равенства.
bash
также поддерживает стандартный способ выполнения таких тестов:
case $var in
*.awk) echo '$var ends with ".awk"' ;;
*) echo '$var does not end with ".awk"' ;;
esac
Обратите внимание, что в обоих случаях шаблон *.awk
не может быть заключен в кавычки. Цитирование шаблона сделало бы его сравнением строк, а не совпадением с шаблоном.
Причина, по которой ваш тест всегда оказывается успешным, двояка:
*.awk
(, включая пробел с обеих сторон ), которая предположительно никогда не будет совпадать, и !
.