WSL-当Linux二进制文件在Bash中不可用时如何回退到exe [英] WSL - How to fallback to exe when linux binary is not available in Bash

查看:15
本文介绍了WSL-当Linux二进制文件在Bash中不可用时如何回退到exe的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要做的是编写既能在常规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 -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.

这篇关于WSL-当Linux二进制文件在Bash中不可用时如何回退到exe的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆