mssql-cli使用以下bash脚本来执行实际的python脚本。据我了解代码,while 循环确定执行脚本的当前目录,然后将此路径添加到 PYTHONPATH 中。 当前目录中没有.py文件,那么为什么要将路径添加到 PYTHONPATH 中?有人可以向我解释脚本的第一部分在做什么吗?谢谢你在这里帮助我。
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $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
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
# Set the python io encoding to UTF-8 by default if not set.
if [ -z ${PYTHONIOENCODING+x} ]; then export PYTHONIOENCODING=utf8; fi
export PYTHONPATH="${DIR}:${PYTHONPATH}"
python -m mssqlcli.main "$@"
想知道这是否仍然与你相关,但我已将其标记为有趣的谜题,以便稍后重新审视......长话短说:它将此脚本文件所在的位置目录添加到PYTHONPATH
,并解析了所有符号链接(获取的文件名和导致 is 的目录都不是符号链接(。
这与使用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
正在解析沿途的符号链接(即登陆链接指向的目录(并在更改后打印工作目录(绝对路径(。在子壳中发生的所有事情和结果都分配给变量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变量或等于空字符串,则导出环境变量。注意:${PYTHONIOENCODING+x}
似乎是另一种形式的${PYTHONIOENCODING:+x}
,它的使用似乎绝对是任意的。还有一个测试来检查是否设置了变量(无论其值如何(。
export PYTHONPATH="${DIR}:${PYTHONPATH}"
PYTHONPATH
现在设置为从绝对解析的路径(路径上的任何地方都不应有符号链接(开始,该路径所在的脚本(或此链接指向的文件(所在的位置。
python -m mssqlcli.main "$@"
调用蟒蛇...