Автоматический экспорт функций оболочки/bash

Вот Perl-решение:

perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile

Этот вывод:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

Переключатель -0777включает режим slurp , при котором весь файл считывается в память. использование модификаторов smдля соответствия позволяет точке соответствовать новой строке, при этом строка обрабатывается как несколько строк.

Переключатель -nсоздает цикл чтения входного файла. Когда видна последовательность dove.bind.bunny , она захватывается в $1с остальными строками в $2, и это то, что печатается, если полное совпадение успешно.

-1
27.06.2018, 03:54
1 ответ

При использовании скрипта с 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, если вы хотите, чтобы они были получены автоматически.

3
28.01.2020, 05:07

Теги

Похожие вопросы