如何在 msys 中连接路径

How to concatenate paths in msys

在 bash shell 脚本中,我必须设置 PYTHONPATH。我们有以下代码:

if [ ${OS} == Windows_NT ]; then
    PYTHONPATH="${TEST_DIR}input;${TEST_DIR}"
else
    PYTHONPATH="${TEST_DIR}input:${TEST_DIR}"
fi
export PYTHONPATH

只要 TEST_DIR 是绝对路径,这在 msys2 下也有效。但是,在我的代码中 TEST_DIR 可以是绝对路径也可以是相对路径。例如TEST_DIR=时。 msys2 不执行魔术 : to ;转换,因此未正确设置 PYTHONPATH。

基本细节

当 msys2 导出环境变量时 /c/first/path:/usr/local 它将外部非 msys 程序转换为 Windows 环境变量,例如 c:/first/path;c:/msys2/usr/local。在那个过程中,它将 unix 风格的文件名转换为 Windows 风格的文件名,并将 : 转换为 ; —— 这是需要的,因为 : 是一个常见的Windows 文件名的一部分。但是,当 msys2 无法将环境变量识别为路径时,这似乎不会发生,./:./input.

就是这种情况。

目前的解决方法是使用如下代码:

case ${TEST_DIR} in
 /*)
   sep=":"
 ;;
 *)
   if [ ${OS} == Windows_NT ]; then
      sep=";" # on windows when TEST_DIR is an relative path we shall concatenate paths in an environment variable with a ;
   else
      sep=":"
   fi
esac
PYTHONPATH="${TEST_DIR}input${sep}${TEST_DIR}"
export PYTHONPATH

但是,这看起来很笨拙,我不相信所有可能的路径都得到了正确处理。

正如 David Grayson 所建议的,在 Linux 下使用的代码也可以在 MSYS2 下工作,并且不需要使用 ; 作为路径分隔符。所以在 Windows 和 linux 下使用的正确代码是:

PYTHONPATH="${TEST_DIR}input:${TEST_DIR}"
export PYTHONPATH