Existe-t-il un équivalent Unix de la variable d'environnement Windows PATHEXT

11

Je me demande s'il existe un équivalent Unix pour la variable d'environnement Windows PATHEXT.

Pour ceux qui n'ont pas d'arrière-plan Windows: l'ajout d'un suffixe de fichier à PATHEXTme permet d'exécuter un script sans taper ce suffixe dans cmd.exe. Par exemple, sur mon ordinateur Windows, PATHEXT contient le suffixe .plet lorsque je veux exécuter un script Perl dans cmd.exe, je peux simplement taper my-scriptet il est exécuté. Cependant, afin d'exécuter le même script bash, je dois écrire le nom complet: my-script.pl.

Comme je travaille actuellement sur Windows et Unix, je tombe presque toujours dans le piège d'oublier de taper le suffixe lorsque je vais à nouveau dans une boîte Unix.

René Nyffenegger
la source
Il serait intéressant de savoir ce que Windows a fait si PATHEXT contenait, par exemple, .sh et .pl et que vous essayiez d'exécuter 'foo' dans un répertoire contenant foo.sh et foo.pl.
Jeff Schaller
Si .shprécédé .pl, foo.shsera exécuté. stackoverflow.com/a/7839178/180275
René Nyffenegger

Réponses:

7

court: non

plus: les scripts shell nécessitent un nom de fichier complet, mais vous pouvez définir des alias pour que vos commandes s'y réfèrent par différents noms. Par exemple

alias my-script=my-script.pl
Thomas Dickey
la source
12

La solution la plus simple consiste simplement à ne pas utiliser d'extensions pour vos scripts. Ils ne sont pas nécessaires et servent uniquement à vous identifier le type de script, mais pas à l'ordinateur. Alors que Windows utilise des extensions pour identifier le type de fichier, les systèmes * nix (à de très rares exceptions telles que gzip) ne le font pas.

Notez que les binaires n'ont pas d' .exeextension dans * nix, ils sont juste appelés foo, non foo.exe. Donc, si vous voulez foo.plêtre exécutable en tant que foo, enregistrez simplement le fichier comme fooen premier lieu.

Alternativement, si vous avez vraiment besoin des extensions pour une raison quelconque, allez dans le répertoire dans lequel vous enregistrez vos scripts et exécutez ceci:

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

Cela itérera sur tous les fichiers avec des extensions et, pour chaque fichier foo.extd'entre eux, créera un lien appelé fooqui pointe vers foo.ext. Notez que cela échouera si vous avez plusieurs scripts avec le même nom mais des extensions différentes.

terdon
la source
7

Si vous voulez vraiment le faire, il existe un moyen. Ajoutez ce qui suit à la fin de .bashrcdans votre répertoire personnel et définissez les PATHEXTnoms d'extension avec des points séparés par :. (Modifié pour inclure les points pour correspondre au comportement de Windows.) Utilisez-le à vos risques et périls.

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
}

N'oubliez pas que vous pouvez utiliser tab pour compléter le nom de la commande s'il n'y a pas d'autre commande commençant également par my-script.

user23013
la source