0

我正在尝试从 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 脚本?

4

2 回答 2

1

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

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

于 2013-08-21T03:35:54.167 回答
1

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

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

根据您要完成的工作,这种替代设计是否可行?

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

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

于 2013-08-21T03:55:08.007 回答