我需要 bash 在登录到我的 Mac 上的新终端时获取我的 .bashrc(因为在登录到 Mac 上的新终端时它不会这样做,它只会执行 .bash_profile)。我找到并成功使用了此命令,并将其添加到我的 .bash_profile 中:
if [ -f ~/.bashrc ] && [ "${SHELL##*/}" == "bash" ]
then
. ~/.bashrc
fi
关于这个命令,有三点我不明白。
- 第一个条件中的 -f 是什么意思?
- 第二个条件中的##/ 表示什么?
- 我理解“. ~/.bashrc”的意思是获取 rc 的 shell 源,但是该命令究竟是如何实现这一点的?这里的“.”应该表示什么?
答案1
-f
是一个谓词,用于测试特定文件(在本例中为 ~/.bashrc)是否存在。##*/
作为变量替换的一部分意味着从变量值的开头删除以“/”结尾的内容 - 例如,如果 SHELL 是“/usr/local/bin/bash”,它将删除“/usr/local/bin/”并只提供“bash”。具体来说:##
意味着删除后面最长的匹配项,*/
匹配以“/”结尾的任何内容。其他相关选项:
#
表示删除最短匹配(即#*/
删除通过第一的“/”),%%
表示从中删除最长的可能匹配结尾,%
表示从末尾删除最短的匹配。.
是命令的简称source
——一个 shell 内置命令,用于在当前 shell 中执行脚本(本例中为 ~/.bashrc)的内容。通常,如果您运行 shell 脚本,它会在子 shell 中运行,并且它定义的任何变量、别名、函数等都会在退出时丢失;source
相反,通过执行它,它定义的内容在当前 shell 中有效。
答案2
1)检查文件 ~/.bashrc 存在
2) ${SHELL} 是一个变量,包含当前 shell 的完整路径。如果你在终端上输入echo $SHELL
或echo ${SHELL}
,它将打印路径。${SHELL##*/} 会删除路径并只打印文件名。echo ${SHELL##*/}
在终端中输入即可查看。
3)句点“。”是内置的 bash 命令,用于在当前进程中运行脚本。即,它获取文件。
所以这一行基本上是说,“如果文件 ~/.bashrc 存在并且当前 shell 是 bash shell,那么源 ~/.bashrc”
我的 ~/.bash_profile 仅包含:
source $HOME/.bashrc