通过管道传输至“type”命令

通过管道传输至“type”命令

我想找出几个命令的类型。在 Linux 中是否可以将xargs搜索结果通过管道传输find到命令中?type

例如:

find . -name anacron | type

或者

find . -name anacron | xargs type

答案1

type不是一个普通命令。它是一个 shell 内置命令。请参阅:

$ type type
type is a shell builtin

因此,您需要调用bashwith-c来实现您想要的

$ 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 从标准输入读取项目 [...],并执行命令

在这种情况下,命令是一个简单的可执行文件,而 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(长度限制适用于执行()子进程在正常命令行中使用的函数)。

相关内容