管道到“类型”命令

我想找出几个命令的类型。 是否可以将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每个文件。 -Ixargs意味着,我们在这里定义一个占位符{}以供稍后使用。 此占位符将替换为找到的文件名。

为什么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()函数)。