从不在 ~/ 中的脚本获取我的 ~/.bash_aliases

从不在 ~/ 中的脚本获取我的 ~/.bash_aliases

我想从脚本更新我的别名。

我有一些新的别名~/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。当然,您可以为其指定一个别名。这也可以扩展 - 例如,根据主机名(或使用pombsg-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,您的别名将被更新和获取。

相关内容