Я пытаюсь использовать 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=$'\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 для разделения на новые строки, почему необходимо включать backspace? - Переполнение стека
Опасно ли делать то, что там обсуждается, IFS=$(echo -en '\n\b')
? Потому что это добавляет \b
к IFS (я проверял). Может ли \b
встречаться в имени файла? Я не хочу, чтобы мой код по ошибке разбивал имя файла.
Также есть ли у вас какие-либо рекомендации о том, как правильно обрабатывать восстановление IFS после цикла for
? Должен ли я хранить его во временной переменной или запускать IFS и оператор for в подоболочке? (и как это сделать?) спасибо