是否可以在调用时禁用 Bash 中的监视模式

是否可以在调用时禁用 Bash 中的监视模式

可以使用 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 monitorbash 也会暂时地设置选项中的parse_shell_options函数,它稍后调用一个名为的函数set_job_control(同样,当处于交互模式时)它将全局变量“job_control”设置为true(“interactive”参数的值)。

请注意,尽管交互式命令能够使用 禁用监视模式,但+O通过该函数的潜在shopt 路由run_shopt_alist是死胡同,因为监视模式不是本机 shopt 选项。shoptshopt -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文件加载时(如上所示),您可以包含一行来禁用它。

相关内容