Unix shell脚本中的cat命令

3
我有两行代码
1)使用以下代码:
for i in `ls *.properties`; do cat $i; done

我遇到了错误:
cat: file_name.properties: No such file or directory.

另一方面:
for i in *.properties; do cat $i; done

工作正常!

我以为这两个是一样的。有人可以帮我理解它们之间的区别吗?使用bash shell。


2
你的文件名包含空格吗? - Karoly Horvath
不,它不是这样的。名称之间用下划线分隔。 - Win Man
请提供一个实际的例子。如果您不想分享真实的文件名,那么提供能够演示问题的内容也是有帮助的。 - Greg Hewgill
2
裸球形式是正确的,但你不应该使用 for i in \ls`。最好加上判断条件 if [[ -f $i ]]; then cat "$i"; fi`,以确保只获取文件而非目录。此外,变量应像我所演示的那样添加引号。 - Dennis Williamson
2
@khaled_webdev: 这带来了很多事情,其中一些是不正确的。你能更具体地说明在那个页面上搜索什么吗? - Dennis Williamson
显示剩余3条评论
2个回答

6
以下命令会打印出什么内容?
cat -v <<< `ls *.properties`

我猜问题在于 ls 是一个奇怪的别名,例如:

ls='ls --color'

编辑:我之前见过这个。别名应该是:alias ls='ls --color=auto'


谢谢你,nosid。正如你所提到的,有一个别名。非常感谢。 - Win Man
@KarolyHorvath:甚至更短:alias ls - l0b0
我也有同样的问题。谢谢! - Marslo

0
很可能有一个与*.properties匹配的目录。然后ls会输出此目录中没有目录名称的文件。然后cat将找不到给定的文件名。
因此,请检查file_name.properties是否在实际目录或某个子目录中。 编辑 要复现问题,您可以尝试以下操作:
# cd /tmp
# mkdir foo.properties
# touch foo.properties/file_name.properties
# for i in `ls *.properties`; do cat $i; done
cat: file_name.properties: No such file or directory

不错的想法,但在这种情况下,他首先会看到 cat: directoryname:: 没有这个文件或目录。(注意双冒号)。 - Karoly Horvath
@KarolyHorvath,你不会成功的,因为ls dir将输出目录的内容,而不是文本dir本身。因此,cat无法看到这个名称,也不能产生你提出的输出。 - A.H.
@Karoly,很好,我以前从未注意到这一点; cat:rc0.d ::没有那个文件或目录. :) - sarnold
@A.H.: 那是因为你只用一个参数做了 ls - Karoly Horvath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接