可以使用 Bash 内部禁用监视模式set +m
。我想知道是否可以使用 Bash 的调用参数来做到这一点。也就是说,类似:
bash +o monitor
也许:
bash +m
我已经查看 Bash 的联机帮助页有一段时间了,现在看来这是不可能的。
答案1
看起来不可能在调用时使用命令行选项/参数禁用交互式 bash 会话的监视模式,除非你作弊。我通过深入研究源代码(主要是文件)来确定这一点外壳程序和工作.c。我在本地克隆了该存储库,git clone git://git.savannah.gnu.org/bash.git
以便更容易搜索。
在调用时禁用监控模式是不可能的,因为 bash 启动序列启用了监控模式后处理各种选项/参数。即使您调用bash +o monitor
bash 也会暂时地设置选项中的parse_shell_options
函数,它稍后调用一个名为的函数set_job_control
(同样,当处于交互模式时)它将全局变量“job_control”设置为true(“interactive”参数的值)。
请注意,尽管交互式命令能够使用 禁用监视模式,但+O
通过该函数的潜在shopt 路由run_shopt_alist
是死胡同,因为监视模式不是本机 shopt 选项。shopt
shopt -o -u monitor
cheat方法依赖于外部文件;您将创建一个替代的 bashrc 文件,其中包含set +m
(并且可以选择获取真正的 ~/.bashrc),然后将 bash 调用为:
bash --rcfile /path/to/that/alternate_bashrc_file
这是有效的,因为 rcfile 解析已完成(使用run_startup_files
功能)后 set_job_control
被调用,因此它能够最终设置 shell 选项。
答案2
可以将监视器设置为禁用:
$ bash +o monitor -c 'shopt -op monitor'
shopt +o monitor
但仅有的对于非交互式 shell(脚本,例如单行代码 (-c))。
对于交互式 shell,即使您尝试,监视器也会重新启用:
$ bash +o monitor
~/.bashrc sourced
$ shopt -op monitor
set -o monitor
$ exit
但是,当bashrc
文件加载时(如上所示),您可以包含一行来禁用它。