.bashrc的作用是什么,它如何工作?


Answers:


131

.bashrc是一个Shell脚本,只要交互式启动,Bash就会运行。它初始化一个交互式外壳会话。您可以将任何命令放在该文件中,您可以在命令提示符下键入该命令。

您可以在此处放置命令来设置要在您的特定环境中使用的外壳,或根据自己的喜好自定义内容。常见的事就摆在.bashrc别名要始终可用。

.bashrc每次交互式shell启动时运行。如果你说:

$ bash ; bash ; bash

再打Ctrl-D三下,.bashrc就会跑三下。但是,如果您这样说:

$ bash -c exit ; bash -c exit ; bash -c exit

.bashrc根本不会运行,因为这-c会使Bash调用变为非交互式。从文件运行Shell脚本时也是如此。

对比.bash_profile.profile仅在新登录Shell的开头运行。(bash -l)你选择一个命令是否已经在.bashrcVS .bash_profile取决于你是否希望它运行一次或每交互shell启动。

作为别名的反例,我更喜欢放入别名,而.bashrc您想对其进行PATH调整.bash_profile,因为这些更改通常不是幂等的

export PATH="$PATH:/some/addition"

如果.bashrc改用这种方式,则每次启动交互式子Shell时,它:/some/addition都会被拖到另一个子外壳的末尾PATH,从而在您键入错误的命令时为Shell产生了额外的工作。

每当你你得到一个新的互动Bash shell中掏出的vi:sh,例如。


6
次要问题:与大多数其他shell不同,bash 在作为登录shell启动时不会自动加载按实例配置文件.bashrc。这有时会导致意外行为。通常的解决方法是.bashrc.profile.bash_profile代替。
Ilmari Karonen 2014年

@IlmariKaronen由于.bashrc不打算供其他Shell使用,因此最好不要从中获取.profile(其他非bashShell 可能会使用)。
chepner

@IlmariKaronen发生了什么(读:我怎么能调试为什么)时,source ~/.bashrc. ~/.bashrc[[ -f ~/.bashrc ]] && source. ~/.bashrc[ -f ~/.bashrc ] && source ~/.bashrc不工作?
Nikos Alexandris

@NikosAlexandris:这是一个单独的问题。请另外询问
沃伦·杨

@WarrenYoung我想,但我意识到它.bashrc确实是来源(使用superuser.com/a/183980/128768的推荐命令)。我面临的问题实际上是https://github.com/junegunn/fzf通过以下命令无法采购.bashrcsource ~/.fzf.bash。我启动了一个新终端,然后Ctrl+ R,我得到了`__fzf_history__`bash: fzf: command not found。我手动进行采购,.bashrc并且相同的快捷键可以按预期启动fzf。抱歉这里的噪音。
Nikos Alexandris

20

.bashrc文件的目的是提供一个地方,您可以在其中设置变量,函数和别名,定义(PS1)提示以及定义每次打开新终端窗口时要使用的其他设置。

每次打开新的终端,窗口或窗格时,都可以运行它。

您可以在这里看到我的(带有语法突出显示的图片)

HISTCONTROL=ignoreboth:erasedups HISTSIZE=100000 HISTFILESIZE=200000
ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
md () { [ $# = 1 ] && mkdir -p "$@" && cd "$@" || echo "Error - no directory passed!"; }
git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'
set -o vi # vi at command line
export EDITOR=vim
test -f ~/.bash_aliases && . $_
test -f ~/.git-completion.bash && . $_
test -s ~/.autojump/etc/profile.d/autojump && . $_
[ ${BASH_VERSINFO[0]} -ge 4 ] && shopt -s autocd
[ -f /etc/bash_completion ] && ! shopt -oq posix && . /etc/bash_completion
[ -z $TMUX ] && export TERM=xterm-256color && exec tmux
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$home/.rvm/scripts/rvm"

说明:

-1。设置我的历史记录文件以忽略重复项,并且比默认文件大很多。
-2。颜色选项ls取决于您使用的是Linux还是OSX
-3。函数“ md”使用一个命令
-4 制作并cd进入目录。如果在git repo中找到当前的git分支,然后...
-5。-9。定义一个很棒的PS1提示,如<code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </ code>
-10。改进了PS2提示
-11。在命令行
-12 处将vi设置为编辑器。将vi设置为默认编辑器
-13。执行我的.bash_aliases文件(如果存在)
-14。如果存在,请执行我的git选项卡完成脚本(用于远程和分支)。
-15。如果存在
-16,则执行自动跳转。如果bash版本> = 4,则允许在不键入cd的情况下进行cd'ing
-17。如果bash完成脚本存在,则执行
-18。如果存在,请使用TMUX
-19。将rvm添加到我的PATH
-20。如果存在,请使用rvm。

我已经将此便携式计算机制成了它,以便它可以在我的任何Linux或OSX机器上运行而无需自定义-因此,在使用某些功能和其他脚本之前,需要对存在性进行大量测试。

这也使在新计算机上立即使用整个文件变得更容易,而不会出现影响打开新终端窗口的问题。


矫枉过正...͏͏͏͏͏͏͏͏͏
Pacerier

嗯?对你有帮助吗?
Michael Durrant

2
非常感谢你的分享。这里有很多信息。
Vic

7

这是一个bash配置文件。

交互式(非登录)shell,然后从以下文件中读取配置:

  • $HOME/.bashrc

对于登录外壳,将从以下文件读取配置:

  • /etc/profile (始终来源)
  • $HOME/.bash_profile (依次检查其余的这些文件,直到找到其中一个,然后再读取其他文件)
  • $HOME/.bash_login
  • $HOME/.profile

下图简单说明了它们的加载方式/加载时间。

echo.bashrc和添加了.bash_profile

交互式外壳vs登录外壳

查看man bash更多信息


2
这实际上并没有为旧问题增加额外的价值。另外,我看到您是Unix&Linux的新手,请不要发布文字图片,而最好使用代码块格式并从控制台进行复制。这样可以搜索/复制/等文本。在您的示例中,实际上并没有任何复杂的命令或任何可进行搜索的好东西,但是对于其他答案来说却是一个好习惯。
Centimane

1
我不确定我是否完全理解您对“旧问题”的引用。该问题在顶部问题列表中,与6万次观看相关。我认为附加值来自格式,而不是像以前的答案那样的对话/猜想。但格式也已被编辑。我会记住您对使用代码块的评论,谢谢。
蒂莫西LJ斯图尔特

2
因为您发布了答案,所以它在“活动”问题列表的顶部。该问题最初于2014年提出,并接受了答案。接受的答案说明了目的,.bashrc并区分了.bashrc.bash_profile涵盖了答案内容的区别。不要灰心,您提出了诚实的努力,但是请尝试专注于回答某些内容未包含在其他答案中的问题。
Centimane
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.