使用内置的 Bash 运行 `exec`

ano*_*nol 9 bash shell command-line

我定义了一个 shell 函数(我们称之为clock),我想将它用作另一个命令的包装器,类似于time函数,例如clock ls -R.

我的 shell 函数执行一些任务,然后以exec "$@".

我希望这个函数即使使用 shell 内置函数也能工作,例如clock time ls -R应该输出内置函数的结果time,而不是/usr/bin/time可执行文件。但exec最终总是运行命令。

如何让我的 Bash 函数作为一个也接受 shell 内置函数作为参数的包装器工作?

编辑:我刚刚了解到它time不是内置的 Bash,而是与管道相关的特殊保留字。我仍然对内置解决方案感兴趣,即使它不适用于time,但更通用的解决方案会更好。

cha*_*aos 9

您定义了一个 bash 函数。因此,在调用该函数时,您已经处于 bash shell 中。因此,该函数可以简单地如下所示:

clock(){
  echo "do something"
  $@
}
Run Code Online (Sandbox Code Playgroud)

可以使用 bash 内置函数、特殊保留字、命令、其他定义的函数调用该函数:

别名:

$ clock type ls
do something
ls is aliased to `ls --color=auto'
Run Code Online (Sandbox Code Playgroud)

内置 bash:

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

另一个功能:

$ clock clock
do something
do something
Run Code Online (Sandbox Code Playgroud)

一个可执行文件:

$ clock date
do something
Tue Apr 21 14:11:59 CEST 2015
Run Code Online (Sandbox Code Playgroud)

  • 是的,`$@` 将运行的 shell 作为父进程,将命令作为子进程。但是当你想使用内置函数、别名等时,你必须保留外壳。或者开始一个新的。 (4认同)
  • 当您使用 `exec` 时,该命令会替换 shell。因此不再有内建、别名、特殊保留字、定义字,因为可执行文件是通过系统调用 `execve()` 执行的。该系统调用需要一个可执行文件。 (3认同)