如何确保在启动非交互式 shell 时始终运行某些内容?

如何确保在启动非交互式 shell 时始终运行某些内容?

假设我有一个脚本:

#!/bin/bash
whoami

我希望拥有它,以便当我执行此脚本时,foo始终在执行之前打印。事实上,我希望foo在执行任何脚本之前打印(不仅仅是这个例子)。

我尝试使用该bashrc文件,但这似乎不起作用:

case $- in
    *i*) echo "foo";;
      *) return;;
esac

答案1

~/.bashrcbash仅由未在 posix 模式运行的非登录交互式调用解释

对于每次调用 bash 都会解释的文件(不包括在 posix 模式下运行的文件),您可以使用$BASH_ENV

$ cat ~/.bashenv
if [[ $- != *i* ]]; then
  echo foo
fi
$ export BASH_ENV=~/.bashenv
$ bash -c 'echo bar'
foo
bar

如果这echo foo只是为了由 bash 解释脚本,即当bash被调用时bash /path/to/file(就像使用#! /bin/bashshebang 或更正确的#! /bin/bash -形式)而不是其他形式的非交互式 shell 调用(例如(运行代码时由、、GNU ...bash -c code完成)或),您可以将 更改为.xtermviparallel$SHELLbash < file[[ $- != *i* ]][[ $- != *[ics]* ]]

zsh 的等效项是~/.zshenv(或$ZDOTDIR/.zshenv)。

除非通过,否则所有 csh/tcsh 调用都会读取~/.cshrc( ) (这就是大多数 csh 脚本都有shebang 的原因)。~/.tcshrc-f#! /bin/csh -f

ksh 曾经遵守$ENV,但出于安全原因,对于非交互式 shell 已停止($ENV交互式调用的处理仍然是 POSIX 要求,sh也是在那里拥有 shell 自定义文件的唯一方法)。


¹ 就像当调用 assh或 when there's$POSIXLY_CORRECTSHELLOPTS=posixin 环境中或者 if 调用 wih时-o posix~/.bashrc当使用某些 bash 版本通过 ssh 进行非交互调用时,也可以由 bash shell 进行解释。 bash启动文件处理有点混乱。

相关内容