Answers:
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
。-I
在xargs
手段,我们在这里定义了一个占位符,{}
以供以后使用。此占位符将替换为找到的文件名。
为什么shell buildins无法使用xargs
:
[...]内置命令包含在外壳本身内。当将内置命令的名称用作简单命令的第一个单词时,Shell将直接执行该命令,而无需调用其他程序。[...]
xargs从标准输入[...]中读取项目,并执行命令
在这种情况下,该命令是一个简单的可执行文件,并且内置的Shell不是可执行文件。在文件系统中找不到它。它在外壳本身内。因此,您必须调用Shell并告诉被调用的Shell调用内置命令。那就是发生了什么bash -c "command"
。
find ... -exec bash -c 'type "$@"' _ {} +
这里有一些问题(有些已经突出显示):
type
是内置的。这不是已解决的命令,而是bash中的函数。请参阅man bash-builtins
。它仅在bash的上下文中起作用,而不在一个xargs
或-exec
分支的subshell中起作用。type
习惯于进行自己的路径搜索。如果给它一个路径(find
不会这样做),它可能只会返回该路径。readlink -f
如果您只是尝试解决符号链接,可能会更好;而且您可以整天xargs readlink
或-exec readlink -f {} +
全部进入管道。这并不是说您无法做您想做的事情。有两种选择。该type
命令可以一次处理多个名称,因此您可以一次提供所有名称:
type $(find /usr/sbin -name anacron)
对于许多命令,如果有太多参数,您将超出命令行长度限制(请参阅参考资料getconf ARG_MAX
)。但是,这在这种情况下将不适用,因为它type
是内置在shell中的,并且不会生成新的进程ID(长度限制适用于子进程在常规命令行中使用的exec()函数)。