bash не может разобрать вывод строки в кавычках из обратного выражения - PullRequest
1 голос
/ 22 марта 2012

почему это не работает в командной строке bash:

cat `echo "'filename with spaces'"`

Выдает следующие ошибки:

cat: 'filename: No such file or directory
cat: with: No such file or directory
cat: spaces': No such file or directory

другими словами, одинарные кавычки в строке, выводимой командой в обратных тиках, не анализируются обычным способом. Кто-нибудь знает, как я могу сделать эту работу? Или, может быть, лучший подход?

Я использовал cat и echo здесь в качестве простого примера, но это поведение довольно раздражает, если, например, вы хотите обработать список файлов, имена которых хранятся в файле.

Ответы [ 5 ]

1 голос
/ 22 марта 2012

Чтобы получить то, что вы действительно пытаетесь сделать, "обработайте список файлов, имена которых хранятся в файле" , нет необходимости в cat:

while IFS= read -r -d '' -u 9 filename
do
    echo "$filename"
done 9< "filename with spaces"

Это позволяет обрабатывать любых путей, предполагая, что filename with spaces содержит пути, разделенные NUL. Если вы рискуете не иметь возможности обрабатывать имена файлов с помощью новых строк, просто удалите -d '' из приведенного выше.

См. Бесполезное использование Cat и особенно Bash FAQ для получения превосходной информации.

1 голос
/ 22 марта 2012

Поставьте кавычки вне команды echo:

cat "`echo "filename with space"`"

или

cat "`echo filename\ with\ space`"
1 голос
/ 22 марта 2012

Это работает на моей стороне:

pearl.235> cat "my ine"
djkwnd
pearl.236> echo "my\ ine" | xargs cat
djkwnd
pearl.@].237>
1 голос
/ 22 марта 2012

Использование set -x будет поучительным.

То, что вам нужно, это

cat "$(echo filename with spaces)"

Но если то, что вы делаете, читает имена файлов с разделителями новой строки, вам следуетиспользуйте конструкцию while read, например:

while read -r file ; do cat "$file" ; done < file-names.txt

Если вы не хотите обрабатывать каждый файл, а вместо этого хотите обработать все сразу, используйте

IFS=$'\n' read -d '' -r -a files < file-names.txt
cat "${files[@]}"
0 голосов
/ 22 марта 2012
cat "`echo filename with spaces`"

должно работать.

Другие примеры:

F='filename with spaces'

echo $F

filename with spaces

cat "${F}"

должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...