为可执行搜索添加一些默认扩展

为可执行搜索添加一些默认扩展

我在 Windows 上使用 Ubuntu 时使用的是 Creators Update,我发现它现在可以运行 Windows 原生 Exe。它还默认在 Ubuntu 路径末尾包含 Windows 路径,这样您就可以从一开始就访问所有 Windows 实用程序。

唯一的问题是 Windows 可执行文件的扩展名是 (.exe),因此,如果我在路径中安装了 7z for Windows,在 bash 中我仍然需要输入

7z.exe

使用它。

我想以某种方式设置它,以便输入

7z

他寻找7z7z.exe

有没有办法添加一个或多个默认扩展,比如说“如果你找不到我写的内容,请尝试在最后添加此扩展”

答案1

如果您愿意放弃默认的命令未找到功能(查找提供命令的包等),则定义一个command_not_found_handle函数来测试是否.exe有可用的版本PATH

command_not_found_handle ()
{
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        return 127;
    fi
}

例如,使用sh而不是进行测试.exe

$ z
z: command not found
$ command_not_found_handle () { if command -v "$1"sh; then "$1"sh "${@:2}"; return $?; else return 127; fi; }
$ z -c 'echo "$@"' _ b c
/usr/bin/zsh
b c
$ ba -c 'echo "$@"' _ b c
/bin/bash
b c

当然,这取决于 WSL 如何挂接到 bash 以提供对 Windows 命令的访问(如果 WSL 正在使用command_not_found_handle自身,则这将不起作用)。在 WSL 上测试,它可以工作。


的原始默认定义command_not_found_handle位于/etc/bash.bashrc

$ tail -15 /etc/bash.bashrc
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi

您只需在重新定义中包含该代码即可:

command_not_found_handle ()
{
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        # check because c-n-f could've been removed in the meantime
        if [ -x /usr/lib/command-not-found ]; then
           /usr/lib/command-not-found -- "$1"
           return $?
        elif [ -x /usr/share/command-not-found/command-not-found ]; then
           /usr/share/command-not-found/command-not-found -- "$1"
           return $?
        else
           printf "%s: command not found\n" "$1" >&2
           return 127
        fi
    fi
}

或者,使用这个技巧自动插入旧定义:

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        original_command_not_found_handle "$@"
    fi
}

相关内容