2017-03-31 43 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

相关问题