2012-03-28 41 views
40

タイトルはすべてそれを言うべきです。私はzshの${BASH_SOURCE[0]}に相当するものを探しています。

注:私が見つけ続けるインターネットを中心に「$0${BASH_SOURCE[0]}と同等である」が、これは偽のようです:$0は、実行コマンドの名前のようです。私のスクリプト(.zshrc)で$ 0をエコーすると$0の場合はzshとなりますが、これは${BASH_SOURCE[0]}と同じではありません。実際には、${BASH_SOURCE[0]}.zshrcファイルを除いてzshで動作するようです。

(それが動作していない)私は本当に私の .zshrcでやっている何を

echo ${BASH_SOURCE[0]} 
source `dirname $0`/common-shell-rc.sh 

ソースに障害が発生した($0zshある)とechoは空白行を出力します。

編集: どうやら、仕事をする $0のために、私はオプション FUNCTION_ARGZEROオプションセットが必要です。これがスクリプトに設定されているかどうかをテストする方法はありますか? (一時的に設定できるように) nofunction_argzeroを設定しない限り、それは明らかにオンであり、それは私のシェルにあります。まだ$0のために何も得られない。 (私はb/cだと私は機能していないと思う)

答えて

12

$0が正しい。ソーススクリプトでは、.またはsourceビルトインに渡されたスクリプトの名前です(したがって、path_dirsオプションが設定されている場合は、$pathルックアップを実行してスクリプトの実際の場所を見つける必要があります)。 )。

.zshrcがソースになっていないため、に設定されていない理由が説明されています。とにかくファイル名と場所はわかっています。それは${ZDOTDIR-~}/.zshrcです。

+0

私はまだこれが正しいかはわかりません。これらの2つのファイルを作成します。 'foo'は' source/foo2'を含み、 'foo2'は' echo $ 0'を含みます。 '。/ foo'を実行すると、ソーススクリプトの名前ではなく'/foo'の出力が得られます。 '$ 0'を' $ {BASH_SOURCE [0]} 'に置き換えて、bashで再実行すると'。/ foo2'が得られます。 – Thanatos

+0

@ Thanatos '。/ foo2'(zsh 4.3.10;これはある時点で変更されている可能性がありますが、4.0以降では変更されている可能性があります)が表示されます。あなたの指示と比較して、私は '#!/ bin/zsh'を' foo'の先頭に追加して、zshの下でスクリプトを実行しました。あなたはzshの下で 'foo'を実行していますか? – Gilles

+2

明快に強調するには... ** 'zsh' **(そしておそらく他のシェル)では、' $ 0'の値は呼び出し元のスクリプトではなくソーススクリプトです。これはBashでどのように動作するかではありません。したがって、zshの '$ 0'はBashの$ {BASH_SOURCE [0]}と同じです。 – toxalot

2

多分あなたは$_をお探しですか?

# foo.sh 
source foo2.sh 

# foo2.sh 
echo $_ 

収率のzshの等価

# ./foo.sh 
foo2.sh 
+0

最良の結果を得るには:$ {BASH_SOURCE: - $ _} ' – mpapis

+1

あなたが答えを出す理由は何ですか?答えがのような場合にその理由を説明するのがベストプラクティスです。特徴。 (地獄、マンページの短いセクションをコピーして貼ることさえ悪い考えではありません!) – ELLIOTTCABLE

+0

script1.shがscript2.shをソースしてecho $ _を出す場合、bashでは$ _が動作しません。 $ {BASH_SOURCE [0]}がscript2.sh(echo $ _を呼び出す添え字)を返す間に、script1.sh、つまり$ 0(メインスクリプト)を返します。したがって、$ _は基本的に$ 0 AFAICSに似ています。 –

33

${BASH_SOURCE[0]}${(%):-%N}、NOT $0ある(OPが言ったように、後者は.zshrcに失敗した)

ここ%値の即時拡張を示します。 %Nは、zshが現在実行しているスクリプト、ソースファイル、 またはシェル関数の名前を示します。

最近起動されたいずれかです。存在しない場合は、パラメータ$ 0と等価です。」(man zshmisc

+4

素晴らしい - これはOPのために働くはずですが、実際の '$ BASH_SOURCE'は、_functions_の内部で呼び出されたとしても、それが囲む_file_を参照するので、'%x'ではなく '%N'であることに注意してください。 – mklement0

+0

文書を読んで、なぜここに ':-'が必要なのか、なぜ' $ {(%)%N} ''が必要でないのか分かりません。 '$ {(%): (注:私はそれが動作しないことを認識しています) – PierreBdR

+0

別のオプション - %Nが利用可能な形式のドキュメントがありますか? – Martin

8

シンボリックリンクする場合。ドットファイルのディレクトリにzshrcとは、ディレクトリ内の他のファイルを参照したい場合、これを試してみてください。

SOURCE=${(%):-%N} 
while [ -h "$SOURCE" ]; do 
    DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 
    SOURCE="$(readlink "$SOURCE")" 
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" 
done 
DOTFILES_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 

(私はhereからループスクリプトを得ました。)

+0

別のオプションが書かれているドキュメントはありますか? %Nは利用可能ですか? – Martin

+0

[zshドキュメントを試す](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion。html) –

10

${(%):-%x}bashに最も近いzsh同等ですの$BASH_SOURCE(およびksh${.sh.file}) - は、$0ではありません。

重要なポインタと背景情報をhis answerに提供するためのHui Zhengの帽子のヒント。

にかかわらず、スクリプトがを供給されているか否かの、

  • を囲むスクリプトの(潜在的相対)パスを返します。
    • 具体的には、それはまた、など~/.zshrc(不可解がシェルのパスを返す$0とは異なり)ファイル初期化/プロファイルの内側に働きます。かかわらず、スクリプトかで定義された関数内部から呼び出されたかどうかの
  • (関数内 機能名を返す $0とは異なり)。は

私が見つけた$BASH_SOURCEへの唯一の違いは、次のあいまいなシナリオである - でも(zshの5.0.5で観察)のバグでありうる:で別の関数内にネスト機能内ソースのスクリプト、そのネストされた関数は(再び)と呼ばれたとき${(%):-%x}後(リターンのいずれか何か「のzsh」)を供給された後に、囲んでスクリプトのパスを返しません。


${(%):-%x}に関する背景情報:変数名の代わりに

  • (%):-パラメータ(変数)拡張(${...})で通常表すために使用されている使用可能なエスケープシーケンスを行います環境情報の文字列などの文字列を決定する変数PS1で使用されるdを主対話型プロンプトとして表示します。

    • %見出しParameter Expansion Flagsman zshexpnに記載されているすべてがパラメータ展開フラグ、のインスタンスです。
  • %xは、プロンプト文字列で使用できるエスケープシーケンスの1つで、上記のように機能します。現在のディレクトリを表すには%dのように多くのものがあります。

    • man zshmiscリストの見出しSIMPLE PROMPT ESCAPES下にあるすべての利用可能な配列。
+0

他のオプション - %xが利用可能なドキュメントがありますか? – Martin

関連する問題