2017-03-31 82 views
1

我正在讀取spark的環境變量設置shell程序。我不太明白這部分。

代碼如下所示:

# 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" 

,第一部分是由評論說,部分解決的聯繫,並在第二部分,它是說相對路徑轉換爲絕對路徑。

但我沒有看到這兩個「this」:this="$common_bin/$script"this="$config_bin/$script"之間的任何區別。我認爲前4行已經解決了鏈接並給變量「this」一個絕對路徑,爲什麼shell在第二部分(第二個註釋之後的命令)中再次執行相同的操作?

在此先感謝。

+0

btw,那些只是看起來像普通的shell變量,而不是環境變量。 –

+0

順便說一句,一個問題的問題。問什麼' - '做的非常好,但它應該是**自己的問題。 (也就是說,如果您查看[POSIX實用程序語法指南](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html)),您可以自己找到答案。 –

回答

1

雖然腳本的意圖似乎正是查爾斯所提到的,但是代碼有一個問題,它將使common_binconfig_bin都設置爲相同的值。

的問題是,在第5行:

this="$common_bin/$script" 

這將使this點腳本的物理路徑,從pwd -P較早獲得。

然後,在第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

是的,我同意你的意見。這兩個「$ this」具有完全相同的值。我不明白爲什麼作者設置$ config_bin並再次設置$ this。我發佈了完整的文件,並沒有更多的代碼在文件中。 – Frankie

1

config_bin相信腳本的源位置視圖是正確的。這可以是邏輯的位置。

common_bin變得相當長,得到一個物理的位置(不包括任何符號鏈接)。


假設這個腳本是/opt/foobar-1.23/bin/something

如果你有一個符號鏈接foobar-1.23/opt/foobar和運行腳本作爲/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。這兩個$具有完全相同的值。我不明白爲什麼作者在shell程序中寫入第二個塊。 – Frankie