在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?
答案 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)/..")
这是你想要的输出吗?