在 Linux 中,我可以向 bashrc 添加别名,它将成为永久别名。在 Mac OS 中,我尝试做同样的事情:
vim ~/.bashrc
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH f or scripting
alias prj="cd ~/Documents/projects"
### Added by the Heroku Toolbelt
export PATH="/usr/local/heroku/bin:$PATH"
话虽如此,我得到了这个:
$ alias
alias rvm-restart='rvm_reload_flag=1 source '\''/Users/alex/.rvm/scripts/rvm'\'''
那么我的别名在哪里prj
?我重新启动了笔记本电脑,但什么都没有改变。
$ cat ~/.profile
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting
test -f ~/.bashrc && source ~/.bashrc
$ cat ~/.bashrc
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH f or scripting
alias prj="cd ~/Documents/projects"
### Added by the Heroku Toolbelt
export PATH="/usr/local/heroku/bin:$PATH"
答案1
通常,bash
仅将~/.bashrc
启动脚本文件作为交互文件,未登录shell。
通常,bash
只~/.profile
为交互式登录shell。
通常,Terminal.app 将新终端窗口视为交互式登录shell。
因此在正常情况下,只有你的~/.profile
会被读取和执行;你的~/.bashrc
永远不会被读取和执行。
~/.profile
为了解决这个问题,我通常会创建名为(如果它尚不存在)的 shell 启动脚本,并将以下命令添加到该文件,以便它检查该~/.bashrc
文件是否存在,然后来源如果它存在,则读取它并在当前 shell 进程中执行它,而不是子 shell):
test -f ~/.bashrc && source ~/.bashrc
按要求重新表述:
Mac OS X 的终端应用程序通常bash
以“登录”模式运行您的 shell ( )。当bash
以登录模式运行时,它不会读取/执行~/.bashrc
。相反,它会读取并执行~/.profile
。如果您想将内容放入 中~/.bashrc
并让它们在每个新的终端窗口中读取和执行,您需要创建一个名为 的 shell 脚本文件~/.profile
,并让该文件包含一个查找~/.bashrc
并读取和执行 的命令。
如果动词“source”让你困惑:“source”一个shell脚本文件是指一个shell(比如bash
)从一个文件中读取shell命令并运行这些命令在当前 shell 进程中,因此它们会影响当前 shell 进程的环境。通常你编写的其他 shell 脚本文件不是来源;相反,它们是在子 shell(的单独实例或副本bash
)中执行的,并且它们无法改变其父 shell 环境中的任何内容(bash
当您打开新的终端窗口时启动的父 shell 的主实例)。
要让 shell 执行脚本,可以使用source
shell 内置的命令。该source
命令的快捷方式是.
(是的,只是一个点/句号/句号字符)。在此答案的先前版本中,我使用了运算.
符而不是命令source
。
答案2
您是打开了新的终端窗口还是source ~/.bashrc
编辑后运行?当前终端需要更新路径/别名。
$ vim ~/.bashrc
alias prj='cd ~'
:x
$ alias
$ alias rvm-restart='rvm_reload_flag=1 source '\''/Users/dx072/.rvm/scripts/rvm'\'''
$ source ~/.bashrc
$ alias
$ alias prj='cd ~'
alias rvm-restart='rvm_reload_flag=1 source '\''/Users/dx072/.rvm/scripts/rvm'\'''