Почему не удается сбросить переменную IFS? - PullRequest
1 голос
/ 19 июня 2020

Показать текущую переменную IFS:

echo $IFS |xxd
00000000: 0a  

Я хочу сбросить IFS как значение по умолчанию \t\n.

IFS=$' \t\n'
echo $IFS |xxd
00000000: 0a  

Почему не удается сбросить переменную IFS ?

1 Ответ

0 голосов
/ 19 июня 2020

Вы сбрасываете IFS правильно. Проблема в вашем echo. Вы должны использовать echo -n "$IFS" | xxd.

Взглянув на man bash (выделено мной):

Разделение слов

Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметических операций c раскрытия , которые не встречались в двойных кавычках для разделения слов.

Оболочка обрабатывает каждый символ IFS в качестве разделителя и разбивает результаты других расширений на слова по этим символам. Если IFS не задано или его значение равно <space><tab><newline>, значение по умолчанию, то последовательности <space>, <tab> и <newline> в начале и конце результатов предыдущие расширения игнорируются , и любая последовательность IFS символов не в начале или в конце служит для разделения слов. Если IFS имеет значение, отличное от значения по умолчанию, то последовательности пробельных символов space и tab игнорируются в начале и конце слова, пока пробельный символ находится в значении IFS (пробельный символ IFS). Любой символ в IFS, который не является пробелом IFS, вместе с любыми соседними символами IFS пробелов, ограничивает поле. Последовательность из IFS пробельных символов также рассматривается как разделитель. Если значение IFS равно нулю, разделения слов не происходит.

Поскольку вы не заключили в двойные кавычки IFS, он проходит через logi c разделения слов оболочки. Поскольку IFS по определению содержит символы IFS внутри себя, они игнорируются оболочкой. Двойные кавычки предотвращают это.

...