使用系统命令而不是 Bash 内置命令而不指定完整路径

Ant*_*gan 18 bash shell-builtin

我使用 Bash 作为我的交互式 shell,我想知道是否有一种简单的方法让 Bash 在它们共享相同名称的情况下运行系统命令而不是 shell 内置命令。

例如,使用系统kill(from util-linux) 打印指定进程的进程 ID (pid) 而不是发送信号:

$ /bin/kill -p httpd
2617
...
Run Code Online (Sandbox Code Playgroud)

在不指定系统命令的完整路径的情况下,使用 Bash 内置命令代替系统命令。该kill内建不具备-p这样的命令失败选项:

$ kill -p httpd
bash: kill: p: invalid signal specification
Run Code Online (Sandbox Code Playgroud)

我尝试了Make bash use external `time` command 而不是shell builtin 中列出的答案但它们中的大多数只能工作,因为time实际上是 shell关键字- 而不是 shell builtin

除了暂时禁用内置的 Bash 之外enable -n kill,到目前为止我见过的最好的解决方案是使用:

$(which kill) -p httpd
Run Code Online (Sandbox Code Playgroud)

是否有其他更简单(涉及较少输入)的方法来执行外部命令而不是内置的 shell?

请注意,这kill只是一个例子,我想要一个通用的解决方案,类似于使用command内置前缀阻止与外部命令具有相同名称的函数的方式。在大多数情况下,我通常更喜欢使用内置版本,因为它可以节省分叉新进程,有时内置版本具有外部命令没有的功能。

che*_*ner 21

假设env在您的路径中:

env kill -p http
Run Code Online (Sandbox Code Playgroud)

env在(可能)修改的环境中运行由其第一个参数命名的可执行文件;因此,它不知道或使用 shell 内置命令。

这会产生一些 shell 作业控制问题,但不依赖于外部命令:

exec kill -p bash &
Run Code Online (Sandbox Code Playgroud)

exec需要一个可执行文件来替换当前的 shell,所以不使用任何内置程序。该作业在后台运行,以便您替换分叉的后台 shell,而不是您当前的 shell。

  • `(exec kill -p http)` 会导致作业替换子外壳而不是当前外壳,并且您不必处理作业控制问题。 (7认同)
  • `env` 显然是正确的答案恕我直言。 (2认同)