gpt4 book ai didi

bash - 为什么量词不通过 xargs

转载 作者:行者123 更新时间:2023-11-29 09:48:16 26 4
gpt4 key购买 nike

我遇到的问题是通配符量词由于某种原因没有通过 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`

现在 shell 扩展在 ls 调用之前进行,导致与 ls -la f*

相同的输出

最佳答案

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

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

但是当你通过 xargs 将该参数传递给 ls 时,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 传递到 ls 时,您无法让它扩展它,因为那里没有 shell。

关于bash - 为什么量词不通过 xargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com