为每个非交互式 bash 会话执行相同的命令

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.bashrcbash_profile呼吁仅用于登录或交互式shell。有没有办法为非交互式 shell 创建一些类似的调用?

She*_*vek 2

要使 bash 在作为非交互式 shell 调用时解析文件,您需要设置环境变量BASH_ENV以指向该文件。来自man bash(调用部分):

\n\n
\n

当 bash 以非交互方式启动时,要运行 shell 脚本,例如,它会在环境中查找变量 BASH_ENV,如果它出现在其中,则扩展它的值,并使用扩展后的值作为名称要读取和执行的文件。Bash 的行为就像执行了以下 com\xe2\x80\x90\n 命令:

\n\n
    if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi\n
Run Code Online (Sandbox Code Playgroud)\n\n

但 PATH 变量的值不用于搜索文件\xe2\x80\x90\n 名称。

\n
\n\n

那么在哪里设置BASH_ENV呢?

\n\n

要么: \n如果您希望变量在系统范围内的环境中可用,那么放置它的好地方是/etc/environment. 该文件专门用于系统范围的环境变量设置。它不是由 shell 而是由 PAM 模块解析pam_env,因此您不能在其中使用 shell 语法或变量扩展,而只能使用以下类型的简单赋值:

\n\n
    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

\n\n
    session       required   pam_env.so readenv=1\n
Run Code Online (Sandbox Code Playgroud)\n\n

(注意:readenv实际上不需要打开/关闭配置文件读取的标志,因为它默认设置为打开(1) - 但确保也没有什么坏处。)

\n\n

或者: \n如果您正在使用不提供 的系统pam_env,那么我想到的最佳替代方案是编写一个简单的初始化脚本(或 systemd 上的服务单元文件)来解析自定义配置文件(例如/etc/default/environment)启动。

\n