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

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

Pour ceux sans fond de Windows: L'ajout d'un suffixe de file à PATHEXT me permet d'exécuter un script sans taper ce suffixe dans cmd.exe. Par exemple, sur mon ordinateur Windows, PATHEXT contient le suffixe .pl et quand je veux exécuter un script Perl dans cmd.exe, je peux simplement taper my-script et il est exécuté. Pourtant, afin d'exécuter le même script dans bash, j'ai besoin d'écrire le nom complet: my-script.pl .

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

court: non

plus long: les scripts shell nécessitent un nom de file complet, mais vous pouvez définir des alias pour vos commands afin de les désigner par des noms différents. Par exemple

 alias my-script=my-script.pl 

La solution la plus simple est de ne pas utiliser d'extensions pour vos scripts. Ils ne sont pas nécessaires et ne servent qu'à identifier le type du script, mais pas à l'ordinateur. Bien que Windows utilise des extensions pour identifier le type de file, les systèmes * nix (à quelques exceptions près comme gzip ) ne le font pas.

Notez que les binarys n'ont pas d'extension .exe dans * nix, ils s'appellent juste foo , pas foo.exe . Donc, si vous voulez que foo.pl soit exécutable comme foo , sauvegardez simplement le file en tant que foo en premier lieu.

Sinon, si vous avez vraiment besoin des extensions pour une raison quelconque, allez dans le directory où vous sauvegardez vos scripts et exécutez ceci:

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

Cela va parcourir tous les files avec des extensions et, pour chaque file foo.ext d'entre eux, va créer un lien appelé foo qui pointe vers foo.ext . Notez que cela échouera si vous avez plusieurs scripts avec le même nom mais des extensions différentes.

Si vous voulez vraiment le faire, il y a un moyen. Ajoutez ce qui suit à la fin de .bashrc dans votre directory personnel et définissez PATHEXT sur les noms des extensions avec des points séparés par PATHEXT (Modifié pour inclure les points correspondant 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 } 

Souvenez-vous également que vous pouvez utiliser l'onglet pour compléter le nom de la command s'il n'y a pas d'autre command qui commence également par my-script .