8

在 bash 中,我通过这一行获取执行脚本的父文件夹名称

SCRIPT_PARENT=`readlink -f ${BASH_SOURCE%/*}/..`

有什么方法可以在 zsh 和 bash 中都可以实现这一点?

假设我有一个/some/folder/rootfolder/subfolder/script包含内容的文件:

echo `magic-i-am-looking-for`

我希望它表现得这样:

$ cd /some/other/folder
$ . /some/folder/rootfolder/subfolder/script
/some/folder/rootfolder
$ . ../../folder/rootfolder/subfolder/script
/some/folder/rootfolder
$ cd /some/folder/rootfolder
$ . subfolder/script
/some/folder/rootfolder
$ cd subfolder
$ . script
/some/folder/rootfolder

这应该在 bash 和 zsh 中工作。我的第一个实现了这种行为,但由于$BASH_SOURCE在 zsh 中不起作用。

所以基本上它的:

有没有办法$BASH_SOURCE在 zsh 中进行模拟,也可以在 bash 中使用?

4

3 回答 3

12

我现在意识到$0在 zsh 中的行为就像$BASH_SOURCE在 bash 中一样。因此,$BASH_SOURCE在可用时使用并回退$0解决我的问题:

${BASH_SOURCE:-$0}

当从以下来源采购时,还剩下一点 zsh 边缘情况$PATH

zsh> cat ../script
echo \$0: $0
echo \$BASH_SOURCE: $BASH_SOURCE
echo '${BASH_SOURCE:-$0}:' ${BASH_SOURCE:-$0}
zsh> . script
$0: script
$BASH_SOURCE:
${BASH_SOURCE:-$0}: script
bash> . script
$0: bash
$BASH_SOURCE: /home/me/script
${BASH_SOURCE:-$0}: /home/me/script

我可以做一个which script,但这不会与其他案例一起玩得很好

于 2013-02-24T21:05:33.207 回答
7

虽然在 zsh 中很容易做到这一点,但使用能够在 zsh 中评估的纯 bash 也同样容易。如果您不能使用任何可能在您的路径上或不在您的路径上的命令,那么您只能使用变量更改来实现您想要的:

SCRIPT_SOURCE=${0%/*}

这很可能是一条相对路径。如果您真的想要完整路径,那么您将不得不求助于外部命令(您可以自己实现它,但要避免使用非常可用的命令会做很多工作):

SCRIPT_SOURCE=$(/bin/readlink -f ${0%/*})

这不取决于您的 $PATH,它仅取决于 /bin/readlink 是否存在。几乎可以肯定的是。

现在,您希望这是一个源文件。这很好,因为您可以导出您设置的任何变量,但是如果您执行上述操作,则 $0 将是源文件的位置,而不是调用脚本的位置。

这只是意味着您需要设置一个变量来保存源脚本知道的 $0 值。例如:

您将获取的脚本:

echo ${LOCATION%/*}

获取该脚本的脚本:

LOCATION=$0
<source script here>

但鉴于 ${0%/*} 扩展非常紧凑,您可以使用它来代替脚本。

于 2013-02-06T11:42:06.783 回答
0

因为您能够从 $PATH 运行命令,所以我将执行以下操作:

SCRIPT_PARENT=$(readlink -f "$(which $0)/..")

那是你想要的输出吗?

于 2012-07-27T10:04:42.967 回答