是否所有外壳程序都读取“ .bashrc”等效文件?


105

~/.bashrc 唯一指定用户特定的环境变量,别名,对PATH变量的修改等的地方吗?

我问,因为似乎这~/.bashrc似乎是bash-only,但是也存在其他shell ...

Answers:


93

该文件$HOME/.profile被许多shell使用,包括bash,sh,dash和其他可能的shell。

从bash手册页:

当bash作为交互式登录shell调用时,...它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。读取该文件后,它将按该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在的且可读的第一个命令中读取并执行命令。

csh和tcsh明确不看,~/.profile但是那些shell有点过时了。


7
默认情况下,Zsh不会读取.profile。这就是为什么我删除了先前的回答,以说明这一点。Zsh仅在由名为sh的符号链接调用时读取.profile。
fschmitt 2010年

10
tcsh在某些环境中仍然很流行。
Maciej Piechotka 2010年

1
fschmitt:谢谢你的指正;固定。Maciej Piechotka:毫无疑问,这是真的。但是,也可以(尽管很复杂)使* rc脚本根据运行它们的shell导入特定的其他rc脚本。
msw

1
对于这种工作方式,用户需要确保每个外壳程序都是登录外壳程序。例如,在Gnome Terminal中,转到Profile-> Title and Command,然后启用Run command as a login shell。您还需要删除~/.bash_profile或使其成为源~/.profile
Mikel 2013年

@fschmitt您也可以$HOME/.profile从Zsh内部获取资源.zshrc。我倾向于将所有可移植外壳程序放入其中.profile,然后可以在可能会在其间进行跳转的任何环境中共享它。
本杰明·R

56

~/.profile是环境变量的定义和你想,当你登录到运行非图形程序的正确的地方(例如ssh-agentscreen -m)。如果它是Bourne风格的shell(sh,ksh,bash),则由登录shell执行。~/.zprofile改为运行Zsh,运行Csh和tcsh ~/.login

如果您在X显示管理器(xdm,gdm,kdm等)下登录,是否~/.profile运行取决于您的发行版配置显示管理器以及桌面环境的方式。如果您在“自定义会话”下登录,通常会执行~/.xsession

~/.bashrc是bash特定设置(例如别名,函数,shell选项和提示)的正确位置。顾名思义,它专用于bash。csh具有~/.cshrc,ksh具有~/.kshrc,zsh具有<drumroll> ~/.zshrc

另请参见:
.bashrc和.bash_profile之间的区别
应该使用哪些安装文件来通过bash设置环境变量?
Zsh没有命中〜/ .profile


别忘了zsh .zlogin除了在.zprofile运行之后 还具有其他功能.zshrc(但仅适用于登录Shell)。请参阅ZSH常见问题解答
Geeb 2014年

21

没有通用文件,但是您可以使每个外壳程序都从通用文件中读取。

  1. bash.bash_profile或读取.bashrc
  2. zsh读取.zprofile .zshrc
  3. ksh.profile或读取$ENV

所以这是我的工作:

~/.env

# Put environment variables here, e.g.
PATH=$PATH:$HOME/bin

~/.shrc

test -f "$HOME/.env" && . "$HOME/.env"

# Put interactive shell setup here, e.g.
alias ll='ls -l'
PS1='$PWD$ '
set -o emacs

~/.bashrc

test -f ~/.shrc && source ~/.shrc

# Put any bash-specific settings here, e.g.
HISTFILE=~/.bash_history
shopt -s extglob
IGNOREEOF=yes

~/.zshenv

# Put any zsh-specific settings for non-interactive and interactive sessions, e.g.
setopt braceexpand
setopt promptsubst
setopt shwordsplit

~/.zshrc

test -f ~/.shrc && source ~/.shrc

# Put any zsh-specific interactive settings here, e.g.
HISTFILE=~/.zsh_history
setopt ignoreeof

~/.profile

# Interactive sub-shells source .env, unless this is bash or zsh,
# because they already sourced .env in .bashrc or .zshrc.
if test -z "$BASH_VERSION" -a -z "$ZSH_VERSION" || test -n "$BASH_VERSION" -a \( "${BASH##*/}" = "sh" \)
then
    test -f "$HOME"/.env && . "$HOME"/.env
fi

# The name is confusing, but $ENV is ksh's config file for interactive sessions,
# so it's equivalent to .bashrc or .zshrc.
# Putting this here makes running an interactive ksh from any login shell work.
test -f "$HOME"/.shrc && export ENV="$HOME"/.shrc

# Put any login shell specific commands here, e.g.
ssh-add
stty -ixon

~/.bash_profile

source ~/.bashrc
source ~/.profile

~/.zlogin

# zsh sources .zshrc automatically, only need to source .profile
source ~/.profile

~/.zprofile

(empty)

如果您具有对系统的root访问权限,则另一种方法是设置pam_env

你可以放

session optional pam_env.so user_envfile=.env

在相关/etc/pam.d文件中(例如/etc/pam.d/common-session在Debian上),然后在用户登录时PAM从中读取环境变量~/.env

请注意,pam_env基本上仅支持VAR=value条目。

更多信息:


14

没有像不同外壳程序的环境配置文件这样的东西,因为它甚至是特定于外壳程序的如何定义它们的。

在csh中,使用setenvbash export定义它们。

无论如何,您可以编写自己的配置文件,并将其包含source在外壳的dotfile中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.