Bash 如何从shell脚本设置别名?

Bash 如何从shell脚本设置别名?,bash,Bash,我正在尝试从shell脚本设置一个应用于当前shell(运行脚本的shell)的别名。别名用于cd-ing到脚本文件夹中。以下是(不工作)脚本: 我很快意识到这是行不通的,因为它生成的别名与脚本的子shell相关 然后,我尝试获取该文件的源代码(如.makeAlias.sh)。但是,这产生了一个错误:dirname:invalical option--b 如何编写使别名与外壳(运行脚本的外壳)相关的bash脚本?/makeAlias.sh将在子外壳中执行,所做的更改仅应用于子外壳。一旦命令终止,

我正在尝试从shell脚本设置一个应用于当前shell(运行脚本的shell)的别名。别名用于
cd
-ing到脚本文件夹中。以下是(不工作)脚本:

我很快意识到这是行不通的,因为它生成的别名与脚本的子shell相关

然后,我尝试获取该文件的源代码(如
.makeAlias.sh
)。但是,这产生了一个错误:
dirname:invalical option--b


如何编写使别名与外壳(运行脚本的外壳)相关的bash脚本?

/makeAlias.sh
将在子外壳中执行,所做的更改仅应用于子外壳。一旦命令终止,子shell将继续,更改也将继续


使用
查找文件/makeAlias.sh
源代码。/makeAlias.sh
将在当前shell上下文中读取并执行文件名参数中的命令,即当脚本使用
源代码运行时,它将在现有shell中运行,脚本创建或修改的任何变量在脚本完成后都将保持可用。

直接的问题是
$0
的值现在是
-bash
。您可能希望重构代码以使用不同的参考点,或者简单地对路径进行硬编码

要回答“我该怎么做…?”,您没有做错任何事情,只是逻辑必须适应不同的环境——特别是,当您编写脚本时,
$0
是父进程的,而不是您正在编写的脚本的名称

根据您试图实现的目标,这种替代设计是否可行

newr () { r=$(pwd); }
cdr () { cd "$r"; }
newr

也就是说,
cdr
只是将目录更改为变量
r
包含的任何内容。使用功能
newr
可以方便地将
r
设置到当前工作目录。您可以在
.bashrc
或类似文件中定义这些函数,并以交互方式使用它们

我试图找到一个很好的链接,说明为什么要选择函数而不是别名,但找不到任何合理简洁和正确的链接。也许我太懒了。无论如何,别名有一些不幸的、令人稍感意外的副作用,例如,当您试图提供参数而别名不需要这些参数时。
newr () { r=$(pwd); }
cdr () { cd "$r"; }
newr