是否有与 Windows 环境变量 PATHEXT 等效的 Unix

Ren*_*ger 12 shell environment-variables

我想知道是否有 Windows 环境变量的 Unix 等效项PATHEXT

对于那些没有 Windows 背景的人:添加文件后缀以PATHEXT允许我执行脚本而无需在 cmd.exe 中键入该后缀。例如,在我的 Windows 计算机上,PATHEXT 包含后缀.pl,当我想在 cmd.exe 中执行 Perl 脚本时,我只需键入my-script即可执行。然而,为了在 bash 中执行相同的脚本,我需要写全名:my-script.pl.

由于我目前同时在 Windows 和 Unix 上工作,我几乎总是陷入再次进入 Unix 框时忘记键入后缀的陷阱。

ter*_*don 13

最简单的解决方案是不要为您的脚本使用扩展。它们不是必需的,仅用于向您识别脚本的类型,而不用于识别计算机。虽然 Windows 使用扩展名来标识文件类型,但 *nix 系统(极少数例外,例如gzip)不这样做。

请注意,二进制文件.exe在 *nix 中没有扩展名,它们只是被称为foo,而不是foo.exe. 因此,如果您想foo.pl以 可执行文件foo,只需将文件另存为foo

或者,如果您出于某种原因确实需要扩展,请进入您保存脚本的任何目录并运行以下命令:

for f in *.*; do ln -s "$f" "${f%%.*}"; done
Run Code Online (Sandbox Code Playgroud)

这将遍历所有带有扩展名的文件,并且对于其中的每个文件foo.ext,将创建一个名为的链接,该链接foo指向foo.ext. 请注意,如果您有多个名称相同但扩展名不同的脚本,这将失败。


Tho*_*key 8

短:没有

更长:shell 脚本需要完整的文件名,但您可以为命令定义别名,以通过各种名称引用它们。例如

alias my-script=my-script.pl
Run Code Online (Sandbox Code Playgroud)


use*_*013 8

如果你真的想做,有办法。.bashrc在主目录的末尾添加以下内容,并将PATHEXT扩展名设置为以点号分隔的扩展名:。(更改为包含点以匹配 Windows 行为。)使用它需要您自担风险。

if declare -f command_not_found_handle >/dev/null; then 
    eval "original_command_not_found_handle() $(declare -f command_not_found_handle|tail -n +2)"
fi
command_not_found_handle(){
    local PATHEXT_EXPANDED i
    IFS=: read -a PATHEXT_EXPANDED<<<"$PATHEXT"
    for i in "${PATHEXT_EXPANDED[@]}"; do
        if type "$1$i" &>/dev/null; then
            "$1$i" "${@:2}"
            return $?
        fi
    done
    if declare -f original_command_not_found_handle >/dev/null; then
        original_command_not_found_handle "$@"
    else
        return 127
    fi
}
Run Code Online (Sandbox Code Playgroud)

还请记住,如果没有其他命令也以my-script.