Intereting Posts
Централизованное управление пакетами для дистрибутива на основе RPM Как мой скрипт знает, когда я нахожусь в виртуальной консоли против xterm? Получение ZFS для отображения физических дисков в zpool Кто-нибудь знает, где изменить это значение «bufsize»? (стримеры ST / mt LTO) Удивительный менеджер окон и настройки клавиатуры Первые символы команды, повторяющиеся на дисплее при завершении Установить пакет из репо не в источниках Добавить и выписать файл с переменными именами из списка переменных Установка Ubuntu для Android Какова была первоначальная (-ые) причина (-ы) добавления «стандартной ошибки», которая отделена от «стандартного вывода»? Что случилось с / dev / raw /? Чашки с использованием сервера печати и локальных принтеров одновременно? Отображать скорость передачи при выполнении «cp» из командной строки? Как запустить программу через терминал, если она разделяет ее имя с другой программой hard vs – in limits.conf

почему нам здесь не нужен экспорт?

$ IFS=";" $ read first second i am;a_i bc $ echo $first i am $ echo $second a_i bc $ echo $IFS 
  1. Правильно ли, что read first second является подпроцессом текущего процесса оболочки? Если да, то почему нам не нужно export IFS=";" ?
  2. почему IFS пуст?

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

Нет, read – функция bash bultin . Здесь нет подсеток или подпроцессов, поэтому нам не нужно экспортировать IFS .

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

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

Пытаться:

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

Заметка

  • Понимание IFS

Если мы напечатаем type read мы получим read is a shell builtin . Поэтому он не запускается как подпроцесс.

В ответ на вопрос, почему IFS пуст. Это не. Но значение в IFS меняет поведение оболочки. Ниже приведен не объяснение, а результат моих экспериментов с использованием bash на Debian Gnu + Linux.

a=";"; echo $a a=";"; echo $a производит ; ,

IFS=";"; echo $IFS IFS=";"; echo $IFS создает пустую строку. IFS=";"; echo "$IFS" IFS=";"; echo "$IFS" производит ; ,

Теперь a=";"; echo $a a=";"; echo $a производит пустую строку, но IFS=" "; a=";"; echo $a IFS=" "; a=";"; echo $a IFS=" "; a=";"; echo $a производит ; еще раз.

Так

Теперь IFS=";"; a=";"; echo $a IFS=";"; a=";"; echo $a IFS=";"; a=";"; echo $a производит пустую строку, но IFS=" "; a=";"; echo $a IFS=" "; a=";"; echo $a IFS=" "; a=";"; echo $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 устанавливается в <space> , a \t ab и a \n ewline. Каждый из них имеет специальные свойства в $IFS поскольку они являются $IFS . $IFS пробелов $IFS не сохраняются, и каждая последовательность либо усекается в одно поле, когда оболочка выполняет расстановку слов, тогда как все остальные будут разделять одно поле на разделитель. $IFS whitespace также будет полностью удалено из начала или конца поля. Например:

 IFS=/; slashes=///////; printf '<%s>' $slashes <><><><><><><> IFS=' '; spaces=' '; printf '<%s>' $spaces <> printf '<%s>' $spaces$slashes <///////> 

Но пробел $IFS очевидно, не удаляется, если он не находится в $IFS :

 IFS=/; printf '<%s>' $spaces$slashes < ><><><><><><>