2012-07-27 10 views
6

は両方のzshやbashで動作するように、zshの中でこれを実現する方法はありますか?これはbashのとのzshで動作するはず

$ 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 

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

私はそれがこのように動作します:

は私が内容のファイル/some/folder/rootfolder/subfolder/scriptを持っていると仮定します。私の最初の動作はこの動作ですが、$BASH_SOURCEがzshで動作しないために起こります。

したがって、基本的にその:

もbashで働くのzshで$BASH_SOURCEをエミュレートする方法は、ありますか?

+1

期待される出力を例に挙げてください。 – shkschneider

答えて

8

zshの$0がbashの$BASH_SOURCEのように振る舞いました。

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が、これを行うことができます:よう$PATHから調達する場合、

${BASH_SOURCE:-$0} 

左少しzshのエッジケースがあります:私の問題を解決したときに利用できるので$BASH_SOURCEを使用して、バック$0に落ちます他のケースでもうまくいきません

+1

私の答えを参照してください:http://stackoverflow.com/questions/9901210/bash-source0-equivalent-in-zsh/23259585#23259585 –

0

あなたの$ PATHからのコマンドを実行することができましたので、私はそのような何かやる:

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

をご希望の出力ということですか?

+0

このコマンドは必ずしもパス上にあるわけではありません。また、スクリプトがシェルにソースされている場合は動作します。 –

5

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%/ *}拡張がとてもコンパクトであることを考えると、あなたはスクリプトの代わりにそれを使うことができます。

+0

あなたは正しいです: '$ 0'はzshの答えです。残念ながら、bashは '$ 0'を設定していないので、ソースコードをbashと違えば動作します –

関連する問題

 関連する問題