用管道输入“类型”命令


10

我想找出几个命令的类型。在Linux中可以将管道或xargs搜索结果从管道传送findtype命令中吗?

例如:

find . -name anacron | type

要么

find . -name anacron | xargs type

我认为Oli的答案是最好的答案。混乱的答案是可行的,但是奥利的答案很聪明。
Helio

Answers:


17

type不是正常的命令。这是壳贝廷。看到:

$ type type
type is a shell builtin

所以,你需要调用bash-c实现你想要什么

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"

甚至更简单(无需xargs):

$ find . -name anacron -exec bash -c "type {}"  \;

它将bash -c "type ./file"与查找到的每个文件一起调用find-Ixargs手段,我们在这里定义了一个占位符,{}以供以后使用。此占位符将替换为找到的文件名。

为什么shell buildins无法使用xargs

[...]内置命令包含在外壳本身内。当将内置命令的名称用作简单命令的第一个单词时,Shell将直接执行该命令,而无需调用其他程序。[...]


xargs从标准输入[...]中读取项目,并执行命令

在这种情况下,该命令是一个简单的可执行文件,并且内置的Shell不是可执行文件。在文件系统中找不到它。它在外壳本身内。因此,您必须调用Shell并告诉被调用的Shell调用内置命令。那就是发生了什么bash -c "command"


3
你可以把它凝结find ... -exec bash -c 'type "$@"' _ {} +
穆鲁

2
@muru确实,我再次阅读了自己的答案并看到了它=)
混乱

11

这里有一些问题(有些已经突出显示):

  • type是内置的。这不是已解决的命令,而是bash中的函数。请参阅man bash-builtins。它仅在bash的上下文中起作用,而不在一个xargs-exec分支的subshel​​l中起作用。
  • type习惯于进行自己的路径搜索。如果给它一个路径(find不会这样做),它可能只会返回该路径。readlink -f如果您只是尝试解决符号链接,可能会更好;而且您可以整天xargs readlink-exec readlink -f {} +全部进入管道。

这并不是说您无法做您想做的事情。有两种选择。该type命令可以一次处理多个名称,因此您可以一次提供所有名称:

type $(find /usr/sbin -name anacron)

对于许多命令,如果有太多参数,您将超出命令行长度限制(请参阅参考资料getconf ARG_MAX)。但是,这在这种情况下将不适用,因为它type是内置在shell中的,并且不会生成新的进程ID(长度限制适用于子进程在常规命令行中使用的exec()函数)。


1
谢谢你,奥莉!这位Linux新手今天已经学到了一些有关“类型”及其行为的新知识。
LjinKazama 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.