管道到“键入”命令

Lji*_*ama 10 command-line bash find

我想找出几个命令的类型。是否可以将管道或xargs搜索结果从Linux 中findtype命令输入到命令中?

例如:

find . -name anacron | type
Run Code Online (Sandbox Code Playgroud)

或者

find . -name anacron | xargs type
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 17

type不是正常的命令。它是一种外壳蛋白。看:

$ type type
type is a shell builtin
Run Code Online (Sandbox Code Playgroud)

所以,你需要调用bashwith-c来实现你想要的

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"
Run Code Online (Sandbox Code Playgroud)

或者更简单(不需要xargs):

$ find . -name anacron -exec bash -c "type {}"  \;
Run Code Online (Sandbox Code Playgroud)

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

为什么 shell 内置函数不能用于xargs

[...] 内置命令包含在 shell 本身中。当内建命令的名称用作简单命令的第一个字时,shell 会直接执行该命令,而不调用其他程序。[...]


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

在这种情况下,命令是一个简单的可执行文件,内置的 shell 不是可执行文件。它在文件系统中找不到。它在外壳本身内。所以你必须调用shell并告诉被调用的shell调用内置命令。这就是发生的事情bash -c "command"

  • 您可以将其压缩为 `find ... -exec bash -c 'type "$@"' _ {} +` (3认同)
  • @muru确实,我再次阅读了我自己的答案并看到了它=) (2认同)

Oli*_*Oli 11

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

  • 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)
Run Code Online (Sandbox Code Playgroud)

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