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

$ 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 пуст?

4 Solutions collect form web for “почему нам здесь не нужен экспорт?”

Правильно ли, что чтение первой секунды является подпроцессом текущего процесса оболочки? Если да, то почему нам не нужно экспортировать 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 < ><><><><><><> 
  • Почему мои изменения в .profile не влияют?
  • Как установить переменную среды в командной строке и отобразить ее в командах?
  • Удалите папку с тем же именем, что и переменная среды
  • Разница между переменными среды и экспортированными переменными среды в bash
  • Переменная среды для команды, вызванная через nice
  • Избегайте передачи переменной среды в скрипт python
  • Как запустить Steam с рабочего стола Xfce?
  • Настройка переменных окружения в Ubuntu
  • Заменить переменные окружения в файле с их фактическими значениями?
  • Переменная IFS игнорируется в системе ()
  • Makefile make install не выполняет несколько строк
  • Linux и Unix - лучшая ОС в мире.