管道到“类型”命令
我想找出几个命令的类型。 是否可以将xargs
的搜索结果管道或xargs
到Linux中的type
命令?
例如:
find . -name anacron | type
要么
find . -name anacron | xargs type
type
不是普通命令。 这是一个壳buitin。 看到:
$ type type type is a shell builtin
所以,你需要用-c
调用bash
来实现你想要的
$ 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从标准输入中读取项目[…],然后执行命令
在这种情况下,命令是一个简单的excutable,而shell内置的不是可执行文件。 它在文件系统中找不到。 它在shell本身内。 所以你必须调用shell并告诉被调用的shell调用builtin命令。 这就是用bash -c "command"
发生的事情。
这里有一些问题(一些已经突出显示):
-
type
是内置的。 它不是一个已经解决的命令,它是bash中的一个函数。 见man bash-builtins
。 它只适用于bash的上下文,因此不是xargs
或-exec
forked子shell。 -
type
用于执行自己的路径搜索。 如果你给它一个路径(因为find
不会这样做),它可能只是返回那条路径。readlink -f
可能会更好,如果你只是想解决符号链接; 你可以xargs readlink
管道进入xargs readlink
或-exec readlink -f {} +
。
这并不是说你不能做你想做的事。 有两种选择。 type
命令可以同时处理多个名称,因此您可以一次提供所有名称:
type $(find /usr/sbin -name anacron)
对于许多命令,如果参数太多,则超出命令行长度限制(请参阅getconf ARG_MAX
)。 但是,这种情况在这种情况下不适用,因为type
已内置到shell中,并且不生成新的进程ID(长度限制适用于子进程在正常命令行中使用的exec()函数)。