如何在zsh中获取执行脚本的父文件夹?

时间:2012-07-27 09:34:10

标签: bash zsh

在bash中,我按此行获取执行脚本的父文件夹名称

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

有没有办法在zsh中以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中无效。

基本上就是:

有没有办法在zsh中模仿$BASH_SOURCE,这也适用于bash?

3 个答案:

答案 0 :(得分:9)

我现在意识到zsh中的$0在bash中表现得像$BASH_SOURCE。因此,在可用时使用$BASH_SOURCE并回退到$0可以解决我的问题:

${BASH_SOURCE:-$0}

$PATH采购时,还有一个小的zsh边缘案例,如:

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,但这对其他情况不会很好

答案 1 :(得分:6)

虽然在zsh中执行此操作很容易,但使用纯bash也很容易,可以在zsh中进行评估。如果您不能使用任何可能在您的路径上的命令,那么您只能使用变量更改来实现您想要的目标:

SCRIPT_SOURCE=${0%/*}

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

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

这不依赖于你的$ PATH,它只取决于/ bin / readlink存在。几乎可以肯定的是。

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

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

您将采购的脚本:

echo ${LOCATION%/*}

源于该脚本的脚本:

LOCATION=$0
<source script here>

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

答案 2 :(得分:0)

因为您可以从$ PATH运行命令,我会做类似的事情:

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

这是你想要的输出吗?