首页 > 解决方案 > WSL 需要扩展 .exe!如何编写通用脚本?(WSL、Cygwin、Linux、MacOS)

问题描述

docopts在我的 Shell 脚本中使用。这在 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"

还是有更聪明的方法可以做到这一点,以便我的脚本可以在任何环境中工作?

标签: linuxmacosshellcygwinwindows-subsystem-for-linux

解决方案


我的建议是安装docopts在 WSL 中,而不是尝试使用 Cygwindocopts.exe版本。这将 (a) 允许您.exe在两者中使用相同的配置(不带扩展名),并且 (b) 可能更兼容。在尝试在 WSL 中使用 Cygwin 可执行文件时,我注意到并听说了一些特性。WSL 在提供 Linux 和 Windows EXE 之间的兼容性层方面做得很好,但 Cygwin 做了一些可能导致问题的“魔术”。


推荐阅读