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.


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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.