我想从脚本更新我的别名。
我有一些新的别名~/updateFiles/newAliases:
alias ga='git add -A'
Run Code Online (Sandbox Code Playgroud)
我也有这个更新脚本~/updateFiles/updater:
#!/bin/bash
cp newAliases ~/.bash_aliases
source ~/.bash_aliases
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用。如何获得source新别名的调用环境?
$ cd ~/updateFiles
$ ./updater
$ ga
-su: ga: command not found
Run Code Online (Sandbox Code Playgroud)
$ cd ~/updateFiles
$ ./updater
$ source ~/.bash_aliases
$ ga
$
Run Code Online (Sandbox Code Playgroud)
区别在于范围和语法非常微妙:
$ ./updater
Run Code Online (Sandbox Code Playgroud)
相当于
$ /bin/bash ./updater
Run Code Online (Sandbox Code Playgroud)
它运行脚本(如果它被标记为可执行文件并且在安装了该exec选项的文件系统上- 即使不满足这些条件之一,后一种形式也能工作)。这意味着它会生成新的 shell 实例并将脚本的内容提供给它。因此,其中定义的任何别名仅限于解释 shell 的持续时间,该持续时间仅到脚本结束。
$ . updater
$ . ./updater
$ source updater
$ source ./updater
Run Code Online (Sandbox Code Playgroud)
意思都是一样的,并告诉当前shell 执行该文件的内容,就像您在命令行中键入它一样。这意味着任何别名、函数、环境变量、shell 选项设置等都将在之后的 shell 中可用。
这也是为什么您有时会看到如下所示的 shell init 文件(~/.bashrc在 Bash 的情况下):
#!/bin/bash
for n in ~/etc/bash/*; do
. $n
done
Run Code Online (Sandbox Code Playgroud)
在哪里~/etc/bash可以看起来像:
$ ./updater
Run Code Online (Sandbox Code Playgroud)
(这些名称是不言自明的)。每当您将一些文件添加到此类 init 目录时,您需要做的就是应用更改. ~/.bashrc。当然,你可以有一个别名。这也可以扩展 - 例如通过根据主机名(或使用pom来自 bsg-games的月相)进行专门的初始化。
这些设置的一大警告:确保使 init 文件“可重入”,因为无论您在一个 shell 中获取它们多少次都无关紧要 - 例如,您可能想要保留的变量应该有条件地定义:
VAR=${VAR:-"value"}
Run Code Online (Sandbox Code Playgroud)
而不是无条件:
VAR="value"
Run Code Online (Sandbox Code Playgroud)
您必须获取文件源,否则别名的生命周期非常短:调用的 shell 的持续时间。
我有这个.bashrc:
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Run Code Online (Sandbox Code Playgroud)
读入别名。还有这个别名:
alias realias='source ~/.bash_aliases'
Run Code Online (Sandbox Code Playgroud)
在我的.bash_aliases文件的开头。更新后,我只是发出realias命令。
我不认为你不能用脚本来做到这一点. 要使用脚本,您必须获得它的来源,而不是像其他人解释的那样执行。另一种方法是使用函数。将这些行添加到您的~/.bashrc:
updater(){
cp ~/newAliases ~/.bash_aliases
source ~/.bash_aliases
}
Run Code Online (Sandbox Code Playgroud)
然后,运行updater,您的别名将被更新和获取。