8

bashでは、この行で実行中のスクリプトの親フォルダー名を取得します

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

zshとbashの両方で機能する方法でzshでこれを達成する方法はありますか?

/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_SOURCEbashでも機能するzshでエミュレートする方法はありますか?

4

3 に答える 3

12

$0私は今、zsh$BASH_SOURCEではbashのように動作することに気づきました。したがって$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、これは他のケースではうまくいきません

于 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 に答える