Unix是否等效于Windows环境变量PATHEXT


11

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

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

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


如果PATHEXT包含例如.sh和.pl,并且您尝试在其中包含foo.sh和foo.pl的目录中运行“ foo”,那么知道Windows会做什么会很有趣。
杰夫·谢勒

如果.shpreceedes .plfoo.sh将会运行。stackoverflow.com/a/7839178/180275
勒内Nyffenegger

Answers:


7

简短:否

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

alias my-script=my-script.pl

12

最简单的解决方案是不对脚本使用扩展名。它们不是必需的,仅对您(而非计算机)标识脚本的类型。Windows使用扩展名来标识文件类型,而* nix系统(很少有例外,例如gzip)则不能。

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

另外,如果由于某些原因确实需要扩展,请进入将脚本保存到的目录,然后运行以下命令:

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

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


7

如果您真的想这样做,有一种方法。.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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.