Показать текущую переменную IFS:
IFS
echo $IFS |xxd 00000000: 0a
Я хочу сбросить IFS как значение по умолчанию \t\n.
\t\n
IFS=$' \t\n' echo $IFS |xxd 00000000: 0a
Почему не удается сбросить переменную IFS ?
Вы сбрасываете IFS правильно. Проблема в вашем echo. Вы должны использовать echo -n "$IFS" | xxd.
echo
echo -n "$IFS" | xxd
Взглянув на man bash (выделено мной):
man bash
Разделение слов Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметических операций c раскрытия , которые не встречались в двойных кавычках для разделения слов. Оболочка обрабатывает каждый символ IFS в качестве разделителя и разбивает результаты других расширений на слова по этим символам. Если IFS не задано или его значение равно <space><tab><newline>, значение по умолчанию, то последовательности <space>, <tab> и <newline> в начале и конце результатов предыдущие расширения игнорируются , и любая последовательность IFS символов не в начале или в конце служит для разделения слов. Если IFS имеет значение, отличное от значения по умолчанию, то последовательности пробельных символов space и tab игнорируются в начале и конце слова, пока пробельный символ находится в значении IFS (пробельный символ IFS). Любой символ в IFS, который не является пробелом IFS, вместе с любыми соседними символами IFS пробелов, ограничивает поле. Последовательность из IFS пробельных символов также рассматривается как разделитель. Если значение IFS равно нулю, разделения слов не происходит.
Разделение слов
Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметических операций c раскрытия , которые не встречались в двойных кавычках для разделения слов.
Оболочка обрабатывает каждый символ IFS в качестве разделителя и разбивает результаты других расширений на слова по этим символам. Если IFS не задано или его значение равно <space><tab><newline>, значение по умолчанию, то последовательности <space>, <tab> и <newline> в начале и конце результатов предыдущие расширения игнорируются , и любая последовательность IFS символов не в начале или в конце служит для разделения слов. Если IFS имеет значение, отличное от значения по умолчанию, то последовательности пробельных символов space и tab игнорируются в начале и конце слова, пока пробельный символ находится в значении IFS (пробельный символ IFS). Любой символ в IFS, который не является пробелом IFS, вместе с любыми соседними символами IFS пробелов, ограничивает поле. Последовательность из IFS пробельных символов также рассматривается как разделитель. Если значение IFS равно нулю, разделения слов не происходит.
<space><tab><newline>
<space>
<tab>
<newline>
space
tab
Поскольку вы не заключили в двойные кавычки IFS, он проходит через logi c разделения слов оболочки. Поскольку IFS по определению содержит символы IFS внутри себя, они игнорируются оболочкой. Двойные кавычки предотвращают это.