У меня есть следующий Bash скрипт:Bash цитата скрипт выдает
DIR="~/Folder/With\ Spaces"
CMD="find $DIR -type f"
# echo showing hidden characters
echo $CMD | cat -v
while read line
do
echo $line
done < <($CMD)
Выход:
find ~/Folder/With\ Spaces -type f
find: ~/Folder/With\: No such file or directory
find: Spaces: No such file or directory
Я прошел через это все так, как я могу думать, с одинарными и двойными кавычками, обратная косая черта и отсутствие обратной косой черты, цитаты вокруг переменной в других строках, без костей.
Если я понимаю, это правильно, CMD должны быть следующие:
find ~/Folder/With\ Spaces -type f
Это должно работать нормально, и так find
не может использовать кавычки пути, это правильный способ сделать это. Эхо показывает, что оно соответствует этому. Ввод этой строки в командную строку прекрасен. Опять же, команда echo
печатает это. Но вывод скрипта говорит, что происходит что-то еще, возможно, на линии done
, где выполняется команда.
Как я могу заставить Bash интерпретировать имя файла как один путь в этом контексте? И почему? Обратная косая черта (чтобы остановить ее от интерпретации ее как двух частей, разделенных пробелами) рассматривается как часть строки, поэтому, где она разбивает ее и почему?
Три вещи. 1: это работает. 2: Ты гений. 3: «Правильное» решение убедило меня переключиться на Python. : D –
Чем глубже я вникаю в bash, тем веселее я с людьми, говорящими, что Perl выглядит как линейный шум. –