2013-08-21 62 views
0

我想从shell脚本中设置一个适用于当前shell(我从中运行脚本的shell)的别名。别名是cd - 进入脚本的文件夹。这里的(不工作)脚本:如何从shell脚本设置别名?

#!/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脚本,使得相关的外壳(运行该脚本的外壳)的别名?

回答

1

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

要回答“我怎么......?”你没有做错什么,只是逻辑必须适应不同的环境 - 特别是,当你编写脚本时,$0是父进程的名称,而不是你正在采购的脚本的名称。

取决于你试图完成什么,也许这另类的设计可以工作?

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

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

+0

我试图找到一个很好的链接为什么超过别名喜欢的功能,但找不到任何合理的简洁和正确的。可能我太懒惰了。无论如何,别名有一些不幸的和轻度惊人的副作用,例如当您尝试提供参数并且别名不需要它们时。 – tripleee

1

./makeAlias.sh将在一个子shell执行,所做的更改只有到子shell适用。一旦命令终止,子shell就会执行并且更改。

采购使用. ./makeAlias.shsource ./makeAlias.sh将读取并从在当前外壳上下文的文件名参数执行命令,当脚本使用source它运行在现有外壳中运行的是文件,创建或修改的任何变量该脚本将在脚本完成后保持可用状态。