Sho*_*eNN 5 bash shell bashrc .bash-profile
我需要实现一些配置 - 如果我的系统上有人bash
以任何形式(交互式、非交互式和bash -c
表单)调用命令,我需要执行一些代码。例如,这是我想添加到每个 bash 调用的命令:
touch /tmp/$RANDOM
我添加了该行/bash/bash.bashrc
,它适用于登录外壳和外壳,通过调用bash
命令初始化。
但这不适用于像这样初始化的 bash 会话:
bash -c 'echo 1'
- 不会创建新文件
从技术文档我明白,bash.bashrc
并bash_profile
呼吁仅用于登录或交互式shell。有没有办法为非交互式 shell 创建一些类似的调用?
要使 bash 在作为非交互式 shell 调用时解析文件,您需要设置环境变量BASH_ENV
以指向该文件。来自man bash
(调用部分):
\n\n\n当 bash 以非交互方式启动时,要运行 shell 脚本,例如,它会在环境中查找变量 BASH_ENV,如果它出现在其中,则扩展它的值,并使用扩展后的值作为名称要读取和执行的文件。Bash 的行为就像执行了以下 com\xe2\x80\x90\n 命令:
\n\nRun Code Online (Sandbox Code Playgroud)\n\nif [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi\n
但 PATH 变量的值不用于搜索文件\xe2\x80\x90\n 名称。
\n
那么在哪里设置BASH_ENV
呢?
要么: \n如果您希望变量在系统范围内的环境中可用,那么放置它的好地方是/etc/environment
. 该文件专门用于系统范围的环境变量设置。它不是由 shell 而是由 PAM 模块解析pam_env
,因此您不能在其中使用 shell 语法或变量扩展,而只能使用以下类型的简单赋值:
VARIABLE=value\n
Run Code Online (Sandbox Code Playgroud)\n\n或者
\n\n VARIABLE=/full/path/to/file\n
Run Code Online (Sandbox Code Playgroud)\n\n更改将在下次登录/身份验证时生效,因此请切换到新的 tty 控制台或注销并重新登录到您的会话。
\n\n在标准桌面系统上,这应该适用于使用 PAM 的所有类型的经过身份验证的会话,包括控制台登录、ssh 和显示管理器,还包括 atd 和 cron 等守护进程。如果一切按预期进行,那么您就完成了,无需继续阅读。
\n\n但是,某些程序/发行版的 PAM 配置文件中偶尔会出现错误,因此,如果/etc/environment
某种类型的程序未解析该错误,请确保在该程序的 PAM 配置文件中加载必要的 PAM 模块/etc/pam.d
:
session required pam_env.so readenv=1\n
Run Code Online (Sandbox Code Playgroud)\n\n(注意:readenv
实际上不需要打开/关闭配置文件读取的标志,因为它默认设置为打开(1) - 但确保也没有什么坏处。)
或者: \n如果您正在使用不提供 的系统pam_env
,那么我想到的最佳替代方案是编写一个简单的初始化脚本(或 systemd 上的服务单元文件)来解析自定义配置文件(例如/etc/default/environment
)启动。