\K[1180345] приводит к тому, что все, что находится слева от [1180346]PATTERN[1180347], не включается в совпадающую строку. Это решение предполагает, что ваш [1180348]grep[1180349] имеет псевдоним [1180350]grep --color=auto
В ответ на вопрос, почему IFS пуст. Это не так. Но значение в IFS
меняет поведение оболочки. Ниже приведено не объяснение, а только результат моих экспериментов с использованием bash на Debian Gnu+Linux.
a=";"; echo $a
производит ;
.
IFS=";"; эхо $IFS
производит пустую строку.
IFS=";"; эхо "$IFS"
производит ;
.
Теперь a=";"; эхо $a
производит пустую строку, но IFS=" "; a=";"; эхо $a
снова производит ;
.
Так
Теперь IFS=";"; a=";"; эхо $a
производит пустую строку, но IFS=" "; a=";";"; эхо $a
производит ;
.
Следовательно, значение IFS изменяет поведение (тогда кавычки не используются в эхо-сигнале).
IFS=\;; set -- $IFS; echo $#; echo "$*"
1
;
IFS=; set -- $IFS; echo $#; echo "$*"
0
#there doesn't seem to be anything here
Как видно - $IFS
в первом случае не пуст - он содержит ровно один разделитель полей.
Когда оболочка разворачивает нецитируемую переменную, она разделяет ее значение на разделители, определенные в $IFS
. Таким образом, каждая переменная потенциально является массивом, разделенным $IFS
. По умолчанию $IFS
установлен в <пространство>
, \t
ab, и \n
ewline. Каждая из них обладает особыми свойствами в $IFS
, так как это $IFS
белый пробел. $IFS
разделители пробела не сохраняются, и каждая последовательность обоих усекается до одного поля, когда оболочка выполняет словоразделение, в то время как все остальные разделяют одно поле на разделитель. $IFS
пробелы также будут полностью удалены из начала или конца поля. Например:
IFS=/; slashes=///////; printf '<%s>' $slashes
<><><><><><><>
IFS=' '; spaces=' '; printf '<%s>' $spaces
<>
printf '<%s>' $spaces$slashes
<///////>
Но $IFS
пробела очевидно не удаляется, когда в не в $IFS
:
IFS=/; printf '<%s>' $spaces$slashes
< ><><><><><><>
Правильно ли я понял, что чтение первого второго - это подпроцесс текущей оболочки. Процесс? Если да, то почему бы нам не экспортировать IFS=";"?
Нет, читайте
это функция баш-бультина . Здесь не создается подоболочка или подпроцесс, поэтому нам не нужно экспортировать IFS
.
почему IFS пуст?
Потому что вы не используете двойную кавычку. Вы изменили значение IFS на ;
, поэтому когда вы повторяете $IFS
, после расширения $IFS
до ;
, оболочка выполняет разделение слов и глобус, с ;
в качестве разделителя. Таким образом, ничего не печатается.
Попробуйте:
$ IFS=";"
$ printf "%s\n" $IFS
$ printf "%s\n" "$IFS"
;
Примечание
Если мы набираем тип прочитанного
, то получаем тип прочитанного - оболочка построенная
. Поэтому он не запускается как подпроцесс.