mssql-cli使用以下bash脚本来执行实际的python脚本。据我了解代码,while循环确定执行的脚本的当前目录,然后将此路径添加到PYTHONPATH。 当前目录中没有.py文件,为什么路径被添加到PYTHONPATH?有人可以向我解释一下脚本的第一部分是做什么的。谢谢你帮助我。
b:defaultwidgetversion
答案 0 :(得分:1)
想知道这是否仍然与您相关,但我将其标记为一个有趣的难题,以后再访问...长话短说:它添加了此脚本文件的位置目录,所有符号链接都已解析(未获取文件名或指向该目录的目录都不是指向PYTHONPATH
的符号链接。
与使用readlink
(或realpath
)这样做基本上是相同的:
export PYTHONPATH="$(dirname $(readlink -f ${BASH_SOURCE})):${PYTHONOATH}"
逐行解剖:
SOURCE="${BASH_SOURCE[0]}"
这会将SOURCE
设置为调用或来源此脚本的路径。
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
如果SOURCE
路径引用符号链接,则进入wile循环。即该文件的第一个迭代中是一个符号链接。随后,如果这是指向另一个链接的链接。
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
(对-P
的简化解释)更改为目录,其中SOURCE
沿路径解析符号链接(即,链接指向/正在指向的目录)更改后打印工作目录(绝对路径)。所有发生在子shell中的结果都分配给变量DIR
。
SOURCE="$(readlink "$SOURCE")"
为 SOURCE
分配了由符号链接解析产生的新路径值。从字面上看,链接所指向的目标是相对的或绝对的(例如,ls -l
所见)。
[[ $SOURCE != \/* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
如果我们通过符号链接解析获得的SOURCE
值不是以/
开头(即绝对路径),则DIR
(SOURCE
所在的目录我们已进入循环的位置)和已解析的符号链接SOURCE
在/
上串联起来,形成一个新的SOURCE
(我们将其置于绝对路径中),然后回到顶部这个循环。注意:在这种情况下,/
到\
的转义似乎是不必要和任意的。
done
完成后。 SOURCE
指向不是符号链接的文件。此时,它的路径可能仍包含符号链接,下一步将对其进行处理。
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
再一次,就像在循环中一样。 DIR
现在应该指向已解析(不是符号链接)SOURCE
文件(最初称为/源文件的目标)所在的目录。
# Set the python io encoding to UTF-8 by default if not set.
if [ -z ${PYTHONIOENCODING+x} ]; then export PYTHONIOENCODING=utf8; fi
如果未设置 shell 变量或等于空字符串,则导出 environmental 变量。注意:${PYTHONIOENCODING+x}
似乎是${PYTHONIOENCODING:+x}
的另一种形式,其使用似乎绝对是任意的。还有一种测试可以检查是否设置了变量(无论其值如何)。
export PYTHONPATH="${DIR}:${PYTHONPATH}"
PYTHONPATH
现在设置为从绝对解析路径(此路径所指向的文件)所在的绝对解析路径(路径中的任何位置都不应有符号链接)开始。
python -m mssqlcli.main "$@"
调用python ...