为什么这不适用于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
作为一个简单示例,但是,例如,如果您希望处理名称存储在文件中的文件列表,则此行为相当烦人
答案 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}"
应该有用。