哪些 bash rc 文件在非交互式/非登录 shell 上运行?

vol*_*ron 6 linux bash cron bashrc bash-scripting

我的理解

  • 没有为非交互式/非登录 shell 调用 rc 文件;例如,那些由cron运行的
    (我不确定这一点,并且会依靠社区的专业知识)

  • 非交互式shell 需要设置BASH_ENV环境变量,这样才能将其设置为特定的 rc 文件(例如,BASH_ENV=$HOME/.bash_profile

希望

我不确定是否有过多的 rc 文件可用,所以很好奇是否有我不熟悉的文件。希望找到一个满足以下条件的rc文件:

  • 无论交互/登录模式如何调用,因此全局 shell 环境变量可以在一个地方设置
  • 表现更像 csh/tcsh

KCD*_*KCD 6

您的具体问题的答案是通常只加载/etc/bash.bashrc(或 /etc/bashrc)。

似乎有几种方法可以解决这个问题,不幸的是,大多数都是解决方法。没有特定的优先顺序:

假登录

登录运行/etc/profile,通常您可以将自定义脚本放在/etc/profile.d/*.sh

将其包装在 bash 登录名中

有时最容易触发登录,即

echo "do whatever $PATH $BASH $PS1 $0"
Run Code Online (Sandbox Code Playgroud)

变成

bash -lc 'echo "do whatever $PATH $BASH $PS1 $0"'
Run Code Online (Sandbox Code Playgroud)

手动加载配置文件

做登录所做的事情,手动加载配置文件

source /etc/profile;echo "do whatever $PATH $BASH $PS1 $0"
Run Code Online (Sandbox Code Playgroud)

编辑全局环境变量

对于简单的变量,你可以添加到/etc/environment看到的Ubuntu系统wide_environment_variables但变量扩张确实工作

THING_HOME="/opt/thing"
PATH="$PATH:/opt/thing" # this will NOT work
Run Code Online (Sandbox Code Playgroud)

对于 PATH 你可以附加到它例如 sudo sed -i 's#PATH=\"[^\"]*#&:/opt/thing#' /etc/environment

编辑所有 bash shell

您可以添加到/etc/bash.bashrc(或 /etc/bashrc),但是如果非交互式,这通常会提前退出,因此您需要在之前修改添加内容:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Run Code Online (Sandbox Code Playgroud)

这些都不做

  • 如果您尝试向 PATH 添加某些内容,请考虑使用符号链接
  • 考虑让你的程序/脚本修改它们自己的环境
  • Systemd 有EnvironmentFileEnvironment例如systemctl edit --full cron.service

我有兴趣听听其他人是否有更好的解决方法!