如何从shell脚本设置别名?

时间:2013-08-21 03:28:06

标签: bash

我正在尝试从shell脚本设置一个适用于当前shell(我正在运行脚本的shell)的别名。别名用于cd - 进入脚本的文件夹。这是(不工作)脚本:

#!/bin/bash
shopt -s expand_aliases

DIR=$(cd $(dirname "$0"); pwd) # Detect the folder of the script.
alias cdr="cd $DIR" # cd into the folder.

我很快意识到这不起作用,因为它所做的别名与脚本的子shell相关。

然后,我尝试获取文件(如. makeAlias.sh中所示)。但是,这会产生错误:dirname: illegal option -- b

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

2 个答案:

答案 0 :(得分:1)

./makeAlias.sh将在子shell中执行,所做的更改仅适用于子shell。一旦命令终止,子shell就会进行更改。

使用. ./makeAlias.shsource ./makeAlias.sh获取文件将从当前shell上下文中的file-name参数读取并执行命令,即使用source运行脚本时在现有shell中,脚本完成后,脚本创建或修改的任何变量都将保持可用。

答案 1 :(得分:1)

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

回答“我怎么......?”你没有做错什么,只是逻辑必须适应不同的环境 - 具体来说,当你找到一个脚本时,$0是父进程的那个,而不是脚本的名字你正在采购。

根据您要完成的任务,这个替代设计可能有用吗?

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

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