未知的条件表达式和运算符

未知的条件表达式和运算符

我需要 bash 在登录到我的 Mac 上的新终端时获取我的 .bashrc(因为在登录到 Mac 上的新终端时它不会这样做,它只会执行 .bash_profile)。我找到并成功使用了此命令,并将其添加到我的 .bash_profile 中:

if [ -f ~/.bashrc ] && [ "${SHELL##*/}" == "bash" ]
then
  . ~/.bashrc
fi

关于这个命令,有三点我不明白。

  1. 第一个条件中的 -f 是什么意思?
  2. 第二个条件中的##/ 表示什么?
  3. 我理解“. ~/.bashrc”的意思是获取 rc 的 shell 源,但是该命令究竟是如何实现这一点的?这里的“.”应该表示什么?

答案1

  1. -f是一个谓词,用于测试特定文件(在本例中为 ~/.bashrc)是否存在。

  2. ##*/作为变量替换的一部分意味着从变量值的开头删除以“/”结尾的内容 - 例如,如果 SHELL 是“/usr/local/bin/bash”,它将删除“/usr/local/bin/”并只提供“bash”。具体来说:##意味着删除后面最长的匹配项,*/匹配以“/”结尾的任何内容。

    其他相关选项:#表示删除最短匹配(即#*/删除通过第一的“/”),%%表示从中删除最长的可能匹配结尾%表示从末尾删除最短的匹配。

  3. .是命令的简称source——一个 shell 内置命令,用于在当前 shell 中执行脚本(本例中为 ~/.bashrc)的内容。通常,如果您运行 shell 脚本,它会在子 shell 中运行,并且它定义的任何变量、别名、函数等都会在退出时丢失;source相反,通过执行它,它定义的内容在当前 shell 中有效。

答案2

1)检查文件 ~/.bashrc 存在

2) ${SHELL} 是一个变量,包含当前 shell 的完整路径。如果你在终端上输入echo $SHELLecho ${SHELL},它将打印路径。${SHELL##*/} 会删除路径并只打印文件名。echo ${SHELL##*/}在终端中输入即可查看。

3)句点“。”是内置的 bash 命令,用于在当前进程中运行脚本。即,它获取文件。


所以这一行基本上是说,“如果文件 ~/.bashrc 存在并且当前 shell 是 bash shell,那么源 ~/.bashrc”

我的 ~/.bash_profile 仅包含:

source $HOME/.bashrc

相关内容