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