Bash 为什么量词不';不能通过xargs

Bash 为什么量词不';不能通过xargs,bash,shell,xargs,Bash,Shell,Xargs,我面临的问题是,出于某种原因,通配符量化器没有通过xargs传递给命令 假设我们的文件file1包含以下内容: -l -a f* 我们需要通过xargs将参数传递给ls 与ls-la命令等效的输出,以及来自终端的附加项 ls: cannot access f*: No such file or directory. 但是文件在目录中(ls-la f*返回合适的输出) 例如,如果我们将f*替换为file1,我们也将获得正确的输出 你能解释一下,为什么会这样?谢谢 编辑1: 添加以下内容似乎很有

我面临的问题是,出于某种原因,通配符量化器没有通过xargs传递给命令

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

-l
-a
f*
我们需要通过xargs将参数传递给ls

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

ls: cannot access f*: No such file or directory.
但是文件在目录中(
ls-la f*
返回合适的输出) 例如,如果我们将f*替换为file1,我们也将获得正确的输出

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

编辑1: 添加以下内容似乎很有趣:我们如何通过shell解释器将参数从文件
file1
传递到
ls
命令。下面是一个例子:

ls `xargs -n3 < file1`
ls`xargs-n3

现在,在调用
ls
之前进行shell扩展,从而产生与
ls-la f*

相同的输出,
文件的内容通过标准输入传递给
xargs
,因此shell从未看到它们处理glob
xargs
然后将它们传递给
ls
,shell也没有看到它们,因此
f*
被视为一个两个字符的文本文件名。

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

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

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

但是当您通过
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*'
$touch'f*'

$xargs ls-la这个
f*
表达式也称为shell glob,应该由shell来解释。您可以单独尝试,例如运行
echo f*

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

但是当您通过
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*'
$touch'f*'
$xargs ls-la