почему мы не должны экспортировать сюда?

[1179835] Использование [1180340]GNU grep[1180341] с опцией [1180342]-P[1180343]:

\K[1180345] приводит к тому, что все, что находится слева от [1180346]PATTERN[1180347], не включается в совпадающую строку. Это решение предполагает, что ваш [1180348]grep[1180349] имеет псевдоним [1180350]grep --color=auto

1
31.08.2014, 02:18
4 ответа

В ответ на вопрос, почему 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 изменяет поведение (тогда кавычки не используются в эхо-сигнале).

1
27.01.2020, 23:12
IFS=\;; set -- $IFS; echo $#; echo "$*"

1
;

IFS=; set -- $IFS; echo $#; echo "$*"

0
#there doesn't seem to be anything here

Как видно - $IFS в первом случае не пуст - он содержит ровно один разделитель полей.

Когда оболочка разворачивает нецитируемую переменную, она разделяет ее значение на разделители, определенные в $IFS. Таким образом, каждая переменная потенциально является массивом, разделенным $IFS. По умолчанию $IFS установлен в <пространство>, \tab, и \newline. Каждая из них обладает особыми свойствами в $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
<      ><><><><><><>
1
27.01.2020, 23:12

Правильно ли я понял, что чтение первого второго - это подпроцесс текущей оболочки. Процесс? Если да, то почему бы нам не экспортировать IFS=";"?

Нет, читайте это функция баш-бультина . Здесь не создается подоболочка или подпроцесс, поэтому нам не нужно экспортировать IFS.

почему IFS пуст?

Потому что вы не используете двойную кавычку. Вы изменили значение IFS на ; , поэтому когда вы повторяете $IFS , после расширения $IFS до ; , оболочка выполняет разделение слов и глобус, с ; в качестве разделителя. Таким образом, ничего не печатается.

Попробуйте:

$ IFS=";"
$ printf "%s\n" $IFS

$ printf "%s\n" "$IFS"
;

Примечание

5
27.01.2020, 23:12

Если мы набираем тип прочитанного , то получаем тип прочитанного - оболочка построенная . Поэтому он не запускается как подпроцесс.

1
27.01.2020, 23:12

Теги

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