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

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

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

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

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

答案1

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

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

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

for f in *.*; do ln -s "$f" "${f%%.*}"; done

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

答案2

如果你真想做的话,还是有办法的。.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
}

另请记住,如果没有其他命令也以 开头,则可以使用 Tab 来完成命令名称my-script

答案3

短:无

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

alias my-script=my-script.pl

相关内容