Bash 为什么量词不';不能通过xargs
我面临的问题是,出于某种原因,通配符量化器没有通过xargs传递给命令 假设我们的文件file1包含以下内容: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: 添加以下内容似乎很有
-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从未看到它们处理globxargs
然后将它们传递给ls
,shell也没有看到它们,因此f*
被视为一个两个字符的文本文件名。通过标准输入将file
的内容传递给xargs
,因此shell永远不会看到它们处理globxargs
然后将它们传递给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