¿Existe un equivalente de Unix de la variable de entorno de Windows PATHEXT

11

Me pregunto si hay un equivalente de Unix para la variable de entorno de Windows PATHEXT.

Para aquellos que no tienen antecedentes de Windows: Agregar un sufijo de archivo PATHEXTme permite ejecutar un script sin escribir ese sufijo en cmd.exe. Por ejemplo, en mi computadora con Windows, PATHEXT contiene el sufijo .ply cuando quiero ejecutar un script Perl en cmd.exe, simplemente puedo escribir my-scripty se ejecuta. Sin embargo, con el fin de ejecutar el mismo script en bash, tengo que escribir el nombre completo: my-script.pl.

Dado que actualmente trabajo tanto en Windows como en Unix, casi siempre caigo en la trampa de olvidar escribir el sufijo cuando vuelvo a un cuadro de Unix.

René Nyffenegger
fuente
Sería interesante saber qué hizo Windows si PATHEXT contuviera, por ejemplo, .sh y .pl e intentara ejecutar 'foo' en un directorio con foo.sh y foo.pl.
Jeff Schaller
Si .shprecede .pl, foo.shse ejecutará. stackoverflow.com/a/7839178/180275
René Nyffenegger

Respuestas:

7

corto: no

más largo: los scripts de shell requieren un nombre de archivo completo, pero puede definir alias para que sus comandos se refieran a ellos por varios nombres. Por ejemplo

alias my-script=my-script.pl
Thomas Dickey
fuente
12

La solución más simple es simplemente no usar extensiones para sus scripts. No son necesarios y solo sirven para identificar el tipo de script para usted, pero no para la computadora. Mientras que Windows usa extensiones para identificar el tipo de archivo, los sistemas * nix (con muy pocas excepciones como gzip) no lo hacen.

Tenga en cuenta que los binarios no tienen .exeextensión en * nix, simplemente se llaman foo, no foo.exe. Entonces, si desea foo.plser ejecutable como foo, simplemente guarde el archivo como fooen primer lugar.

Alternativamente, si realmente necesita tener las extensiones por alguna razón, vaya al directorio en el que guarde sus scripts y ejecute esto:

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

Eso iterará sobre todos los archivos con extensiones y, para cada archivo foo.extde ellos, creará un enlace llamado a fooqué puntos foo.ext. Tenga en cuenta que esto fallará si tiene varias secuencias de comandos con el mismo nombre pero con extensiones diferentes.

terdon
fuente
7

Si realmente quieres hacerlo, hay una manera. Agregue lo siguiente al final de .bashrcen su directorio de inicio y configure los PATHEXTnombres de extensión con puntos separados por :. (Modificado para incluir los puntos para que coincidan con el comportamiento de Windows). Úselo bajo su propio riesgo.

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
}

Recuerde también que puede usar la pestaña para completar el nombre del comando si no hay otro comando que también comience con my-script.

usuario23013
fuente