Linux Redhat 7:如何全局/系统范围设置 shell 选项?

Linux Redhat 7:如何全局/系统范围设置 shell 选项?

我在尝试弄清楚如何为xpg_echo将在我的 Linux RedHat 系统 (7.4) 上运行的每个 shell 打开 bash 选项时遇到了一些麻烦。

我知道我可以通过使用来获得我需要的东西(目的是随时扩展反斜杠转义,因为所有 shell 都是从 HP-UX 服务器移植的)shopt -s xpg_echo,它在大多数情况下工作正常。

现在我的问题是在哪里“系统范围”或“全局”打开此选项,以便我将运行的每个 shell 都使用它。

我尝试将shopt -s xpg_echo一个自定义 shell 放入/etc/profile.d/myshell.sh.

它适用于:

  • 交互式 shell 会话(源自/etc/bashrc
  • 登录 shell 会话(源自/etc/profile
  • #!/bin/bash没有 bash shebang 的 shell 程序(第一行没有)

但我无法让它在以下情况下工作,因为/etc/profile.d/脚本似乎没有获取来源,并且该xpg_echo选项不是从调用 shell 继承的:

  • 当运行 shell 脚本(例如echo "a\tb")作为bash参数时,例如bash /tmp/mytest.sh
  • #!/bin/bash当运行第一行有 bash shebang ( ) 的 shell 脚本时

我想知道是否有任何方法可以xpg_echo在需要运行 shell 的每种情况下打开 shell 选项。

注意:我使用的是 GNU bash,版本 4.2.46

答案1

谢谢你给我指点另一个相关主题

对我来说,关键是使用 BASH_ENV 变量。

正如 bash 参考手册中所述,有打开 shell 的几种方法,给我带来麻烦的是当它被“非交互式”调用时。

为了解决非交互式 shell 不运行任何/etc/profileNor的事实/etc/bashrc,我在 中创建了一个专用的 shell 脚本/etc/profile.d/,例如“custom_shopts.sh”,其中仅包含我希望在每个会话和同一脚本中使用的 shopt 选项我将导出变量BASH_ENV=/etc/profile.d/custom_shopts.sh

因此,在我运行的任何 shell 中(登录 shell、交互式 shell 或非交互式 shell,但 除外bash --posix),/etc/profile.d/custom_shopt.shshell 脚本将运行并定位我期望的 shopt 选项。

相关内容