Esiste un equivalente Unix della variabile d'ambiente Windows PATHEXT


11

Mi chiedo se esiste un equivalente Unix per la variabile d'ambiente di Windows PATHEXT.

Per quelli senza sfondo di Windows: l'aggiunta di un suffisso di file PATHEXTmi consente di eseguire uno script senza digitare quel suffisso in cmd.exe. Ad esempio, sul mio computer Windows, PATHEXT contiene il suffisso .ple quando voglio eseguire uno script Perl in cmd.exe, posso semplicemente digitare my-scripte viene eseguito. Tuttavia, al fine di eseguire lo stesso script in bash, ho bisogno di scrivere il nome completo: my-script.pl.

Dal momento che lavoro su Windows e Unix attualmente, quasi sempre cado nella trappola di dimenticare di digitare il suffisso quando vado di nuovo in una casella Unix.


Sarebbe interessante sapere cosa faceva Windows se PATHEXT conteneva, ad esempio, .sh e .pl e hai provato a eseguire 'foo' in una directory con foo.sh e foo.pl al suo interno.
Jeff Schaller

Se .shprecede .pl, foo.shverrà eseguito. stackoverflow.com/a/7839178/180275
René Nyffenegger

Risposte:


7

breve: no

più a lungo: gli script della shell richiedono un nome file completo, ma è possibile definire gli alias per i comandi affinché possano fare riferimento a essi con vari nomi. Per esempio

alias my-script=my-script.pl

12

La soluzione più semplice è semplicemente non usare le estensioni per i tuoi script. Non sono necessari e servono solo per identificare il tipo di script per te, ma non per il computer. Mentre Windows utilizza le estensioni per identificare il tipo di file, i sistemi * nix (con pochissime eccezioni come gzip) non lo fanno.

Nota che i binari non hanno .exeestensione in * nix, sono semplicemente chiamati foo, no foo.exe. Quindi, se si desidera foo.plessere eseguibili come foo, è sufficiente salvare il file come fooin primo luogo.

In alternativa, se hai davvero bisogno di avere le estensioni per qualche motivo, vai in qualsiasi directory in cui salvi gli script ed esegui questo:

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

Ciò eseguirà l'iterazione su tutti i file con estensioni e, per ciascun file foo.ext, creerà un collegamento chiamato a foocui punta foo.ext. Si noti che ciò non riuscirà se si hanno più script con lo stesso nome ma estensioni diverse.


7

Se vuoi davvero farlo, c'è un modo. Aggiungi quanto segue alla fine di .bashrcnella tua home directory e imposta i PATHEXTnomi delle estensioni con punti separati da :. (Modificato per includere i punti in base al comportamento di Windows.) Utilizzalo a tuo rischio.

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
}

Ricorda inoltre che puoi utilizzare la scheda per completare il nome del comando se non c'è un altro comando che inizi anche con my-script.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.