WSL 需要扩展 .exe!如何编写通用脚本? (WSL、Cygwin、Linux、MacOS)
Extension .exe needed for WSL! How to write a generic script? (WSL, Cygwin, Linux, MacOS)
我在 Shell 脚本中使用 docopts
。这在 Cygwin 中效果很好。
我只需要确保 docopts
存在于我的脚本顶部:
command -v docopts > /dev/null 2>&1 || { echo >&2 "docopts not found"; exit 2; }
...
parsed="$(docopts -h "$help" -V "$version" : "$@")"
eval "$parsed"
但是,在 WSL 中,它需要扩展名 .exe
才能找到要启动的程序。
我应该这样调整我的所有脚本吗?
DOCOPTS=
command -v docopts > /dev/null 2>&1 && DOCOPTS=docopts
command -v docopts.exe > /dev/null 2>&1 && DOCOPTS=docopts.exe
[ -z "$DOCOPTS" ] && { echo >&2 "docopts not found"; exit 2; }
...
parsed="$($DOCOPTS -h "$help" -V "$version" : "$@")"
eval "$parsed"
或者是否有更更聪明的方法来做到这一点,以便我的脚本可以在任何环境中运行?
这看起来不错。建议是根据“uname”对其进行配置。如果 uname 是“cywgin”,则 DOCOPTS= docopts 或基于 WSL.This 的 docopts.exe 将更易于维护且可读。
问候
我的建议是在 WSL 中安装 docopts
而不是尝试使用 Cygwin docopts.exe
版本。这将 (a) 允许您在两者中使用相同的配置(没有 .exe
扩展名),并且 (b) 可能更兼容。在尝试在 WSL 中使用 Cygwin 可执行文件时,我注意到并听说过一些特殊情况。 WSL 在 Linux 和 Windows EXE 之间提供了兼容层, 做得很好,但是 Cygwin 做了一些可能会导致问题的“魔法”。
我在 Shell 脚本中使用 docopts
。这在 Cygwin 中效果很好。
我只需要确保 docopts
存在于我的脚本顶部:
command -v docopts > /dev/null 2>&1 || { echo >&2 "docopts not found"; exit 2; }
...
parsed="$(docopts -h "$help" -V "$version" : "$@")"
eval "$parsed"
但是,在 WSL 中,它需要扩展名 .exe
才能找到要启动的程序。
我应该这样调整我的所有脚本吗?
DOCOPTS=
command -v docopts > /dev/null 2>&1 && DOCOPTS=docopts
command -v docopts.exe > /dev/null 2>&1 && DOCOPTS=docopts.exe
[ -z "$DOCOPTS" ] && { echo >&2 "docopts not found"; exit 2; }
...
parsed="$($DOCOPTS -h "$help" -V "$version" : "$@")"
eval "$parsed"
或者是否有更更聪明的方法来做到这一点,以便我的脚本可以在任何环境中运行?
这看起来不错。建议是根据“uname”对其进行配置。如果 uname 是“cywgin”,则 DOCOPTS= docopts 或基于 WSL.This 的 docopts.exe 将更易于维护且可读。
问候
我的建议是在 WSL 中安装 docopts
而不是尝试使用 Cygwin docopts.exe
版本。这将 (a) 允许您在两者中使用相同的配置(没有 .exe
扩展名),并且 (b) 可能更兼容。在尝试在 WSL 中使用 Cygwin 可执行文件时,我注意到并听说过一些特殊情况。 WSL 在 Linux 和 Windows EXE 之间提供了兼容层, 做得很好,但是 Cygwin 做了一些可能会导致问题的“魔法”。