WSL-当linux二进制文件在Bash中不可用时,如何回退到exe
我需要能够编写既能在常规Unix系统上工作,又能在WSL上工作的脚本,并在未安装linux one/in PATH时尝试使用命令的EXE版本 这是我目前正在使用的代码,但我想知道是否有一种更简单、更不冗长的方法可以使用WSL-当linux二进制文件在Bash中不可用时,如何回退到exe,bash,windows-subsystem-for-linux,Bash,Windows Subsystem For Linux,我需要能够编写既能在常规Unix系统上工作,又能在WSL上工作的脚本,并在未安装linux one/in PATH时尝试使用命令的EXE版本 这是我目前正在使用的代码,但我想知道是否有一种更简单、更不冗长的方法可以使用 if ! command -v docker && command -v docker.exe &>/dev/null; then DOCKER=docker.exe else DOCKER=docker fi if ! command -
if ! command -v docker && command -v docker.exe &>/dev/null; then
DOCKER=docker.exe
else
DOCKER=docker
fi
if ! command -v cargo &>/dev/null && command -v cargo.exe &>/dev/null; then
CARGO=cargo.exe
else
CARGO=cargo
fi
与所有这些问题一样,创建一个函数
docker() {
if hash docker >/dev/null 2>&1; then
command docker "$@"
elif hash docker.exe >/dev/null 2>&1; then
docker.exe "$@"
else
# just to get nice docker: command not found message
command docker "$@"
fi
}
# will run docker.exe or docker
docker run -ti --rm alpine echo hello world
如何将其推广到任何给定的命令 哈,那很有趣。请注意,
eval
是邪恶的
gen_functions() {
for i; do
eval "
$i() {
if hash $i >/dev/null 2>&1; then
command $i \"\$@\"
elif hash $i.exe >/dev/null 2>&1; then
$i.exe \"\$@\"
else
command $i \"\$@\"
fi
}
"
done
}
# will define function for each argument
gen_functions docker cargo diesel
或者,更选择性地,等等:
mask_function() {
local cmd
cmd=$1
shift
if hash "$cmd" >/dev/null 2>&1; then
command "$cmd" "$@"
elif hash "$cmd".exe >/dev/null 2>&1; then
"$cmd".exe "$@"
else
command "$cmd" "$@"
fi
}
docker() { mask_function docker "$@"; }
cargo() { mask_function cargo "$@"; }
# etc.
如何将其推广到任何给定的命令?i、 码头工人、货物、柴油机等。