Почему переменная видима в подоболочке?

sed 's/\([^,]\{0,3\}\)[^,]*/\1/g' усечет каждый столбец к первым 3 символам. Столбцы разграничены'', символ.

Как это работает:

  1. Это находит (жадным) строка, состоящая из от 0 до 3 символов кроме'', и помнит это как первую группу (ссылаемый \1)

  2. Затем это пытается найти так больше символов кроме'', как это могло.

  3. Всем этим заменяют с группой 1 (который является первым 3 символа).

  4. Из-за g опция, это сделает это многократно каждая строка, усекая все столбцы, не только сначала один.

Править:

Как указано в комментарии, 1-й шаг может быть оптимизирован, если Вы используете ([^,]\{3\}\). Таким образом, мы только соответствуем точно 3 символам. Если существует меньше, мы не заботимся, поскольку мы не должны усекать это поле. Таким образом, заключительная команда была бы:

`sed 's/\([^,]\{3\}\)[^,]*/\1/g'`
18
28.09.2014, 02:42
2 ответа

Learning Bash Book неверна. Подоболочки наследуют все переменные. Даже $$ (PID исходной оболочки) сохраняется. Причина в том, что для подоболочки оболочка просто разветвляется и не выполняет новую оболочку (наоборот, когда вы набираете ./ file , выполняется новая команда, например новая оболочка; в вывод strace, см. execve и аналогичные). Так что, по сути, это просто копия (с некоторыми задокументированными отличиями).

Примечание: это не относится к bash; это верно для любой оболочки.

15
27.01.2020, 19:46

Либо вы, либо книга путаете подоболочку с подпроцессом, который является оболочкой.

Некоторые конструкции оболочки приводят к тому, что оболочка разветвляет дочерний процесс. Под Linux fork является частным случаем более общего системного вызова clone , который вы наблюдали в журнале strace . Дочерний запускает часть сценария оболочки. Дочерний процесс называется подоболочкой . Самая прямая такая конструкция - это command1 & : command1 выполняется в подоболочке, а последующие команды выполняются в родительской оболочке. Другие конструкции, которые создают подоболочку, включают подстановку команд $ (command2) и каналы command3 | command4 ( command3 выполняется в подоболочке, command4 выполняется в подоболочке в большинстве оболочек, но не в ksh или zsh).

Подоболочка - это копия родительского процесса, поэтому она имеет не только те же переменные среды, но и все те же внутренние определения: переменные (включая $$ , идентификатор процесса исходной оболочки process), функции, псевдонимы, параметры и т. д. Перед выполнением кода в подоболочке bash устанавливает переменную BASHPID равной идентификатору процесса дочернего процесса.

Когда вы запускаете ./ file , выполняется внешняя команда. Во-первых, оболочка создает дочерний процесс; затем этот дочерний процесс выполняет (с системным вызовом execve ) исполняемый файл ./ file . Дочерний процесс наследует атрибуты процесса своих родителей: окружение, текущий каталог и т. Д. При вызове execve теряются внутренние аспекты приложения: неэкспортируемые переменные, функции и т. Д. Являются понятиями bash, что ядро не знает, и они теряются, когда bash выполняет другую программу. Даже если эта другая программа оказывается сценарием bash, она выполняется новым экземпляром bash, который не знает или не заботится о том, что его родительский процесс также является экземпляром bash. Таким образом, переменная оболочки (неэкспортируемая переменная) не сохраняется execve .

16
27.01.2020, 19:46

Теги

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