2

我面临的问题是通配符量词由于某种原因没有通过 xargs 命令。

假设我们有包含以下内容的文件file1

-l
-a
f*

我们需要通过xargs将参数传递给ls

cat file1 | xargs -n3 ls

与ls -la命令等效的输出,以及来自终端的附加信息,即

ls: cannot access f*: No such file or directory.

但是文件在目录中(ls -la f*返回合适的输出)例如,如果我们将 f* 替换为file1,我们也会有正确的输出。

你能解释一下,为什么会这样?谢谢。

编辑1:

补充一点似乎很有趣,我们如何file1通过 shell 解释器将参数从文件传递到ls命令。下面是示例:

ls `xargs -n3 < file1`

现在在ls调用之前进行 shell 扩展,导致与 for 相同的输出ls -la f*

4

2 回答 2

2

的内容通过标准输入file传递给xargs,因此 shell 永远不会看到它们来处理 glob。xargs然后将它们传递给ls,再次没有外壳看到它们,因此f*被视为文字 2 字符文件名。

于 2013-11-13T22:13:41.447 回答
2

f*表达式也称为 shell glob,应该由 shell 解释。您可以独立尝试,例如通过运行echo f*.

当您ls -la f*从 shell 运行时,shell 会根据您的目录内容对其进行解释,并ls使用扩展版本进行调用,例如:ls -la file1 file2 file3. 如果它不匹配任何文件并且命令需要一个,您可能会对此感到困惑。

但是当您将该参数传递给lsthroughxargs时,shell 没有机会扩展它,并且ls感觉就像它被完全调用为ls -la f*. 它识别-la为选项,并f*作为要列出的文件名。该文件恰好不存在,因此它失败并显示您看到的错误消息。

你可以让它在更常见的文件名上失败:

$ ls non_existing_file
ls: cannot access non_existing_file: No such file or directory.

或者,您可以通过实际拥有该名称的文件来使其成功:

$ touch 'f*'
$ xargs ls -la <<< 'f*'
-rw-rw-r-- 1 jb jb 0 2013-11-13 23:08 f*
$ rm 'f*'

请注意我必须如何使用单引号,以便在创建和删除 shell 时不会将其解释f*glob。

xargs不幸的是,当它直接从to传递时,你不能让它扩展它ls,因为那里没有外壳。

于 2013-11-13T22:13:58.807 回答