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 做了一些可能会导致问题的“魔法”。