file $(ls /usr/bin/* | grep zip) 命令给我错误。怎么了?

Nas*_*dim 4 ls shell wildcards command-substitution

我决定读一本关于 Linux/Unix 的书。我已经读到了一章,他们试图解释如何将命令的输出作为扩展传递给 shell。

以下命令

file $(ls /usr/bin/* | grep zip)

给我错误“无法打开“文件名(没有这样的文件或目录)”。相反,当我这样做时

file $(ls | grep zip)

无论文件夹如何,一切都正常显示。为什么?这是某种参数限制吗?

如果我这样做

file $(ls Pictures/ | grep jpg)

我得到以下信息:

1234.jpg: ERROR: cannot open 1234.jpg (No such file or directory)

在我要列出的目录中向右移动时

nassosdim@ubuntu:~$ cd Pictures/

nassosdim@ubuntu:~/Pictures$ file $(ls | grep jpg)

打印出文件的结果

1234.jpg: JPEG image data, JFIF standard 1.01

有人可以向我解释发生了什么吗?:(

Cal*_*leb 6

错误即将到来,因为 bash 试图*使用 glob 模式匹配将参数中的扩展为 ls。当 glob 与模式不匹配时,它总是会出现这样的错误。在*随后被传递到ls作为一个真正的星号,这不符合一个文件或者这样ls会报错!

关于你正在做的事情有几处是多余的。我知道您正在尝试学习一个结构,但让我们分解一些您刚刚完成的工作以及如何完成。

  1. ls /usr/bin 足以列出 bin 目录中的文件,您根本不需要星号。
  2. 你根本不应该解析 的输出ls,它是模棱两可的并且有潜在危险。
  3. 您可以通过执行不使用 grep 获得相同的效果ls /usr/bin/*zip*,但ls仍然是多余的,您可以将 glob 扩展传递给文件:file /usr/bin/*zip*

最后,find通常是查找文件的更好工具。你可以像这样做你想做的事:

$ find /usr/bin -iname '*zip*' -exec file {} +
Run Code Online (Sandbox Code Playgroud)