2017-03-31 13 views
1

spark用の環境変数セットアップシェルプログラムを読んでいます。私はこの部分をかなり理解していません。

コードは以下の通りである:最初の部分で

# resolve links - $0 may be a softlink 
this="${BASH_SOURCE:-$0}" 
common_bin="$(cd -P -- "$(dirname -- "$this")" && pwd -P)" 
script="$(basename -- "$this")" 
this="$common_bin/$script" 

# convert relative path to absolute path 
config_bin="`dirname "$this"`" 
script="`basename "$this"`" 
config_bin="`cd "$config_bin"; pwd`" 
this="$config_bin/$script" 

export SPARK_PREFIX="`dirname "$this"`"/.. 
export SPARK_HOME="${SPARK_PREFIX}" 
export SPARK_CONF_DIR="${SPARK_CONF_DIR:-"$SPARK_HOME/conf"}" 
# Add the PySpark classes to the PYTHONPATH: 
export PYTHONPATH="$SPARK_HOME/python:$PYTHONPATH" 
export PYTHONPATH="$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH" 

一部には、リンクを解決することであり、第2の部分で、絶対パスへの相対パスを変換するように言われていることをコメントによって言われています。

しかし、私はこれら2つの "this"の間に違いは見られません:this="$common_bin/$script"this="$config_bin/$script"。私は最初の4行はすでにリンクを解決し、変数 "this"に絶対パスを与えて、シェルが2番目の部分(2番目のコメントの後のコマンド)で再び同じことをするのはなぜですか?

ありがとうございます。

+0

btwは、環境変数ではなく通常のシェル変数のように見えます。 –

+0

ところで、質問に1つの質問。 ' - 'がしていることを尋ねるのは完全にうまくいくが、それは**自分の**の質問でなければならない。 (つまり、POSIXユーティリティ構文のガイドライン(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html)を見れば、自分で答えを見つけることができます)。 –

答えて

1

スクリプトの意図は、チャールズが述べたとおりであるようですが、コードにはcommon_binconfig_binの両方を同じ値に設定する問題があります。

問題は、5行目にある:以前pwd -Pから取得したスクリプトの物理パスにthisポイントになるだろう

this="$common_bin/$script" 

そして、ライン8上に、config_binは、物理パスではなく、未解決のシンボリックリンクを有するものであろうthisdirnameに設定されている:

config_bin="`dirname "$this"`" 

したがって、config_bincommon_bin両方が終わるだろう同じ価値を得る。私は、スクリプト内の他の場所で使用されている変数のいずれかが表示されないため、作成者の実際の意図が何であるか分かりません。次のコードセクションはまったく必要ないと思われます。

# convert relative path to absolute path 
config_bin="`dirname "$this"`" 
script="`basename "$this"`" 
config_bin="`cd "$config_bin"; pwd`" 
this="$config_bin/$script" 
+1

はい、私はあなたに同意します。これら2つの "$ this"はまったく同じ値を持っています。著者が$ config_binを設定して$ thisを再度設定した理由を私は理解していません。私は完全なファイルとファイル内のコードを投稿しませんでした。 – Frankie

1

config_binは、元の場所のスクリプトのビューが正しいと信頼します。これは、論理の場所にすることができます。

common_binは実質的な長さになり、物理的なの場所(シンボリックリンクは含まれません)になります。


このスクリプトは/opt/foobar-1.23/bin/somethingとしましょう。

あなたは/opt/foobarfoobar-1.23へのシンボリックリンクを持っている、と/opt/foobar/bin/somethingとしてスクリプトを実行した場合は、その後、config_bin/opt/foobar-1.23/binが含まれています。対照的に、common_binは、/opt/foobar/binを含む。

したがって、上記スクリプトが実行されているときに現在使用されているソフトウェアのバージョンを具体的に参照するパスを書き込む場合は、"$config_bin"を使用することをお勧めします。一方、シンボリックリンクが指し示すソフトウェアのバージョンを常に参照するパスを書きたい場合は、のバージョンがその時点で実行されていたバージョンと異なっていても、"$common_bin"を使用したい場合があります変数はと評価されました。

+0

チャールズ返事をありがとう、私は物理的なパスを理解するのに役立ちます。 @codeforesterによると、まだ質問があります。 5行目では、 "$ this"はすでに物理パスとして設定されています。 $ config_binを取得して、10行目の$ thisに値を再割当てする必要はありません。これらの2 $はまったく同じ値を持っています。著者がシェルプログラムで2番目のブロックを書く理由を理解できません。 – Frankie

関連する問題