sed 's/\([^,]\{0,3\}\)[^,]*/\1/g'
усечет каждый столбец к первым 3 символам. Столбцы разграничены'', символ.
Как это работает:
Это находит (жадным) строка, состоящая из от 0 до 3 символов кроме'', и помнит это как первую группу (ссылаемый \1)
Затем это пытается найти так больше символов кроме'', как это могло.
Всем этим заменяют с группой 1 (который является первым 3 символа).
Из-за g
опция, это сделает это многократно каждая строка, усекая все столбцы, не только сначала один.
Как указано в комментарии, 1-й шаг может быть оптимизирован, если Вы используете ([^,]\{3\}\)
. Таким образом, мы только соответствуем точно 3 символам. Если существует меньше, мы не заботимся, поскольку мы не должны усекать это поле. Таким образом, заключительная команда была бы:
`sed 's/\([^,]\{3\}\)[^,]*/\1/g'`
Learning Bash Book неверна. Подоболочки наследуют все переменные. Даже $$
(PID исходной оболочки) сохраняется. Причина в том, что для подоболочки оболочка просто разветвляется и не выполняет новую оболочку (наоборот, когда вы набираете ./ file
, выполняется новая команда, например новая оболочка; в вывод strace, см. execve
и аналогичные). Так что, по сути, это просто копия (с некоторыми задокументированными отличиями).
Примечание: это не относится к bash; это верно для любой оболочки.
Либо вы, либо книга путаете подоболочку с подпроцессом, который является оболочкой.
Некоторые конструкции оболочки приводят к тому, что оболочка разветвляет дочерний процесс. Под 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
.