bash无法从反引号表达式解析引用的字符串输出

时间:2012-03-22 10:28:26

标签: string bash

为什么这不适用于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

换句话说,后面滴答中命令输出的字符串中的单引号不会以正常方式解析。有谁知道我可以做这个工作的方式?或者更好的方法?

我在这里使用catecho作为一个简单示例,但是,例如,如果您希望处理名称存储在文件中的文件列表,则此行为相当烦人

5 个答案:

答案 0 :(得分:1)

使用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[@]}"

答案 1 :(得分:1)

将引号放在echo命令之外:

cat "`echo "filename with space"`"

cat "`echo filename\ with\ space`"

答案 2 :(得分:1)

这适用于我:

pearl.235> cat "my ine"
djkwnd
pearl.236> echo "my\ ine" | xargs cat
djkwnd
pearl.@].237>

答案 3 :(得分:1)

要了解您真正要做的事情,“处理名称存储在文件”中的文件列表,不需要cat

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

通过假设filename with spaces包含NUL分隔的路径,您可以处理任何路径。如果您可以承担无法使用换行符处理文件名的风险,只需从上面删除-d ''即可。

请参阅Useless Use of Cat,尤其是Bash FAQ,以获取最佳信息。

答案 4 :(得分:0)

cat "`echo filename with spaces`"

应该有用。

其他例子:

F='filename with spaces'

echo $F

filename with spaces

cat "${F}"

应该有用。