我想找出几个命令的类型。在 Linux 中是否可以将xargs
搜索结果通过管道传输find
到命令中?type
例如:
find . -name anacron | type
或者
find . -name anacron | xargs type
答案1
type
不是一个普通命令。它是一个 shell 内置命令。请参阅:
$ type type
type is a shell builtin
因此,您需要调用bash
with-c
来实现您想要的
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
或者更简单(不需要xargs
):
$ find . -name anacron -exec bash -c "type {}" \;
bash -c "type ./file"
它将对 找到的每个文件调用find
。-I
这xargs
意味着,我们在这里定义一个占位符{}
以供稍后使用。此占位符将替换为找到的文件名。
为什么 shell 内置命令不能与以下命令一起使用xargs
:
[...] 内置命令包含在 shell 本身中。当内置命令的名称用作简单命令的第一个字时,shell 会直接执行该命令,而无需调用其他程序。[...]
xargs 从标准输入读取项目 [...],并执行命令
在这种情况下,命令是一个简单的可执行文件,而 shell 内置命令不是可执行文件。它无法在文件系统中找到。它在 shell 本身内。因此,您必须调用 shell 并告诉被调用的 shell 调用内置命令。这就是 的情况bash -c "command"
。
答案2
这里有几个问题(一些已经突出显示):
type
是内置命令。它不是解析的命令,而是 bash 内部的函数。请参阅man bash-builtins
。它仅在 bash 上下文中起作用,因此不是xargs
或-exec
分叉的子 shell。type
习惯于自行进行路径搜索。如果您给它一个路径(它find
习惯这样做),它可能只会返回该路径。readlink -f
如果您只是尝试解析符号链接,则可能会更好;并且您可以整天使用管道输入xargs readlink
或。-exec readlink -f {} +
这并不是说你不能做你想做的事情。有两种选择。该type
命令可以同时处理多个名称,因此你可以一次提供所有名称:
type $(find /usr/sbin -name anacron)
对于许多命令,如果参数太多,您将超出命令行长度限制(请参阅getconf ARG_MAX
)。但是,这不适用于这种情况,因为type
它内置于 shell 中,并且不会生成新的进程 ID(长度限制适用于执行()子进程在正常命令行中使用的函数)。