代码之家  ›  专栏  ›  技术社区  ›  MUG4N

设置pythonpath的bash脚本

  •  0
  • MUG4N  · 技术社区  · 6 年前

    这个 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 "$@"
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ondrej K.    6 年前

    不知道这是否仍然与你相关,但我已标记为有趣的谜题,稍后再访问…长话短说:它将此脚本文件所在位置的目录以及解析的所有符号链接(获取的文件名和指向is的目录都不是符号链接)添加到 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
    

    如果 来源 路径指的是符号链接。也就是说,在这个文件的第一次迭代中是一个符号链接。随后如果这是指向另一个链接的链接。

      DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
    

    这(对 -P )更改到目录 来源 正在解析沿途的符号链接(即链接所指向的目录中的焊盘),并在更改后打印工作目录(绝对路径)。所有发生在子shell中的结果都被赋给变量 DIR .

      SOURCE="$(readlink "$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
    

    如果 来源 我们通过符号链接解析获得的值不是以 / (即是绝对路径) 迪尔 (目录中 来源 我们已经进入循环所在的)并解析了符号链接 来源 连接到 / 形成新的 来源 (我们把它变成一条绝对路径)然后我们回到这个循环的顶部。注:逃逸 / 通过 \ 在这种情况下似乎没有必要而且武断。

    done
    

    做完之后。 来源 指向不是符号链接的文件。在这一点上,它的路径可能仍然包含符号链接,这将在下一步处理。

    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
    

    再来一次,就像在循环中一样。 迪尔 现在应该指向解析的目录(不是符号链接) 来源 文件(最初称为/sourced的目标)驻留。

    # Set the python io encoding to UTF-8 by default if not set.
    if [ -z ${PYTHONIOENCODING+x} ]; then export PYTHONIOENCODING=utf8; fi
    

    出口A 环境的 变量如果 变量未设置或等于空字符串。笔记 ${PYTHONIOENCODING+x} 似乎是 ${PYTHONIOENCODING:+x} 而且它的使用似乎绝对武断。还有一个测试来检查是否设置了变量(无论其值如何)。

    export PYTHONPATH="${DIR}:${PYTHONPATH}"
    

    Python路径 现在设置为以绝对解析路径(路径上任何地方都不应该有符号链接)开始此脚本(或此链接指向的文件)所在的位置。

    python -m mssqlcli.main "$@"
    

    调用python…