假设我有一个脚本:
#!/bin/bash
whoami
我希望拥有它,以便当我执行此脚本时,foo
始终在执行之前打印。事实上,我希望foo
在执行任何脚本之前打印(不仅仅是这个例子)。
我尝试使用该bashrc
文件,但这似乎不起作用:
case $- in
*i*) echo "foo";;
*) return;;
esac
答案1
~/.bashrc
bash
仅由未在 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/bash
shebang 或更正确的#! /bin/bash -
形式)而不是其他形式的非交互式 shell 调用(例如(运行代码时由、、GNU ...bash -c code
完成)或),您可以将 更改为.xterm
vi
parallel
$SHELL
bash < 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_CORRECT
或SHELLOPTS=posix
in 环境中或者 if 调用 wih时-o posix
。~/.bashrc
当使用某些 bash 版本通过 ssh 进行非交互调用时,也可以由 bash shell 进行解释。 bash启动文件处理有点混乱。