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。
归档时间: |
|
查看次数: |
2608 次 |
最近记录: |