Lji*_*ama 10 command-line bash find
我想找出几个命令的类型。是否可以将管道或xargs搜索结果从Linux 中find的type命令输入到命令中?
例如:
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。-I在xargs手段,我们在这里定义了一个占位符,{}以供以后使用。此占位符将替换为找到的文件名。
为什么 shell 内置函数不能用于xargs:
[...] 内置命令包含在 shell 本身中。当内建命令的名称用作简单命令的第一个字时,shell 会直接执行该命令,而不调用其他程序。[...]
xargs 从标准输入 [...] 读取项目,并执行命令
在这种情况下,命令是一个简单的可执行文件,内置的 shell 不是可执行文件。它在文件系统中找不到。它在外壳本身内。所以你必须调用shell并告诉被调用的shell调用内置命令。这就是发生的事情bash -c "command"。
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()函数)。
| 归档时间: |
|
| 查看次数: |
1870 次 |
| 最近记录: |