我在 Windows 上使用 Ubuntu 时使用的是 Creators Update,我发现它现在可以运行 Windows 原生 Exe。它还默认在 Ubuntu 路径末尾包含 Windows 路径,这样您就可以从一开始就访问所有 Windows 实用程序。
唯一的问题是 Windows 可执行文件的扩展名是 (.exe),因此,如果我在路径中安装了 7z for Windows,在 bash 中我仍然需要输入
7z.exe
使用它。
我想以某种方式设置它,以便输入
7z
他寻找7z
和7z.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 正在使用在 WSL 上测试,它可以工作。command_not_found_handle
自身,则这将不起作用)。
的原始默认定义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
}