"read" работает как ожидалось в ZSH, но ведет себя по-другому при использовании любой другой оболочки

Я написал короткий while -do цикл, но я обнаружил, что он работает странно с разными оболочками.

вот это:

find "`pwd`" -type d | while read -r D; do ls ${D}; done

когда я начинаю использовать zsh, все идет хорошо. Однако, используя любую другую оболочку, она ломается, когда я запускаю ее в любом каталоге с экранированным символом в заголовке.

почему это так? Я пытался играть с read -d, но он игнорирует любые экранированные символы, такие как n. read -r также ничего не.

5
задан JakeGould
источник

2 ответов

попробуйте это: find "$(pwd)" -type d | while read -r D; do ls -lb "${D}"; done

С голой ls все, что вы увидите в bash является ? для имени файла, равного, например, "\n".

Также -print0 | xarg -0 вполне может понадобиться в этих случаях и некотируемый $D когда $D содержит пробелы, вероятно, будет причиной проблем.

$ man ls выдержка:

-b, --escape
      print C-style escapes for nongraphic characters
-l    use a long listing format


неразумные вещи:

Пример: $ rm "$(echo -en "\r")" - позволяет удаление файла с одним возвратом каретки (CR) в качестве имени.

и конечно, если вы хотите возиться с этим:

$ echo "TEST" >"This is a filename with a CR _$(echo -en "\r")_here"

... создать файл.

$ rm "This is a filename with a CR _$(echo -en "\r")_here"

... удалить его.

1
отвечен Hannu 2015-09-08 22:16:08
источник

почему это так?

${D} то же самое, что $D. Он будет заменен оболочкой на содержимое переменной D. Так если D содержит Hello World ваш

ls -lb $D

становится

ls -lb Hello World

который попытается перечислить 2 каталога Hello и World (вместо 1 директории Hello World).

Scott уже дал вам правильный способ: использовать "$D", в результате чего будет в

ls -lb "Hello World"
0
отвечен Douglas 2015-09-01 20:14:00
источник

Другие вопросы bash linux shell zsh