shell - temp IFS только как перевод строки. Почему это не работает: IFS = $ (echo -e '\ n')

Я пытаюсь использоватьfor в оболочке для перебора имен файлов с пробелами. Я читаю вstackoverflow вопрос этоIFS=$'\n' может быть использован, и это, кажется, работает нормально. Я тогда читаюв комментарии к одному из ответов чтобы сделать его совместимым с posix для других оболочек, кроме bash, можно использоватьIFS=$(echo -e '\n').

Первый работает, а второй нет. За комментарий проголосовали несколько раз. Я проверил вывод, и переменная, кажется, не содержит символ новой строки.

#!/bin/sh

IFS=$(echo -e '\n')
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
    echo "Found $file"
done

echo

IFS=


Выходные данные показывают, что разделитель полей отсутствует для первого:

0000000
Found one
two two
three


Но уместно на втором:

0000000 0a
0000001
Found one
Found two two
Found three


Я нашел ответ на вопрос, который может или не может быть дубликатом моего вопроса:
Linux - при настройке IFS для разделения на новые строки, почему необходимо включить возврат? - Переполнение стека

Есть ли опасность делать то, что там обсуждается,IFS=$(echo -en '\n\b')? Потому что это добавляет\b на IFS (я проверял). Может\b встречаться в имени файла? Я не хочу, чтобы мой код разделил имя файла по ошибке.

Также есть ли у вас какие-либо рекомендации о том, как правильно обращаться с восстановлением IFS послеfor цикл? Должен ли я хранить его во временной переменной или запустить IFS и оператор for в подоболочке? (и как это сделать?) Спасибо

\n' echo -n "$IFS" | od -t x1 for file in `printf 'one\ntwo two\nthree'`; do echo "Found $file" done


Выходные данные показывают, что разделитель полей отсутствует для первого:

0000000
Found one
two two
three


Но уместно на втором:

0000000 0a
0000001
Found one
Found two two
Found three


Я нашел ответ на вопрос, который может или не может быть дубликатом моего вопроса:
Linux - при настройке IFS для разделения на новые строки, почему необходимо включить возврат? - Переполнение стека

Есть ли опасность делать то, что там обсуждается,IFS=$(echo -en '\n\b')? Потому что это добавляет\b на IFS (я проверял). Может\b встречаться в имени файла? Я не хочу, чтобы мой код разделил имя файла по ошибке.

Также есть ли у вас какие-либо рекомендации о том, как правильно обращаться с восстановлением IFS послеfor цикл? Должен ли я хранить его во временной переменной или запустить IFS и оператор for в подоболочке? (и как это сделать?) Спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос