Czy istnieje uniksowy odpowiednik zmiennej środowiskowej PATHEXT systemu Windows

11

Zastanawiam się, czy istnieje zmienna środowiskowa systemu Windows dla Uniksa PATHEXT.

Dla osób bez tła Windows: Dodanie przyrostka pliku PATHEXTpozwala mi wykonać skrypt bez wpisywania tego przyrostka w cmd.exe. Na przykład na moim komputerze z systemem Windows PATHEXT zawiera sufiks, .pla kiedy chcę wykonać skrypt Perla w cmd.exe, po prostu mogę pisać my-scripti jest on wykonywany. Jednak w celu realizacji tego samego skryptu w bashu, muszę napisać imię i nazwisko: my-script.pl.

Ponieważ obecnie pracuję zarówno na systemie Windows, jak i na Uniksie, prawie zawsze wpadam w pułapkę zapomnienia o wpisaniu sufiksu przy ponownym wejściu na pole Unix.

René Nyffenegger
źródło
Interesujące byłoby wiedzieć, co zrobił Windows, gdyby PATHEXT zawierał na przykład .sh i .pl, a ty próbowałeś uruchomić „foo” w katalogu z foo.sh i foo.pl.
Jeff Schaller
Jeśli .shpreceedes .pl, foo.shzostanie uruchomiony. stackoverflow.com/a/7839178/180275
René Nyffenegger

Odpowiedzi:

7

krótkie: nie

dłuższe: skrypty powłoki wymagają pełnej nazwy pliku, ale możesz zdefiniować aliasy dla swoich poleceń, aby odwoływały się do nich pod różnymi nazwami. Na przykład

alias my-script=my-script.pl
Thomas Dickey
źródło
12

Najprostszym rozwiązaniem jest po prostu nie używanie rozszerzeń do skryptów. Nie są one konieczne i służą jedynie do identyfikacji typu skryptu dla Ciebie, ale nie dla komputera. Podczas gdy Windows używa rozszerzeń do identyfikacji typu pliku, systemy * nix (z nielicznymi wyjątkami, takimi jak gzip) nie.

Zauważ, że pliki binarne nie mają .exerozszerzenia w * nix, są po prostu wywoływane foo, a nie foo.exe. Więc jeśli chcesz foo.plbyć wykonywalny jako foo, po prostu zapisz plik jak foona pierwszym miejscu.

Alternatywnie, jeśli z jakiegoś powodu naprawdę potrzebujesz rozszerzeń, przejdź do katalogu, w którym zapisujesz swoje skrypty i uruchom to:

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

Spowoduje to iterację wszystkich plików z rozszerzeniami i dla każdego foo.extz nich utworzy link o nazwie, fooktóry wskazuje foo.ext. Pamiętaj, że to się nie powiedzie, jeśli masz wiele skryptów o tej samej nazwie, ale z różnymi rozszerzeniami.

terdon
źródło
7

Jeśli naprawdę chcesz to zrobić, istnieje sposób. Dodaj następujące na końcu .bashrcw swoim katalogu domowym i ustaw PATHEXTnazwy rozszerzeń z kropkami oddzielonymi :. (Zmieniono, aby zawierały kropki odpowiadające zachowaniu systemu Windows). Używaj go na własne ryzyko.

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
}

Pamiętaj również, że możesz użyć klawisza tab, aby uzupełnić nazwę polecenia, jeśli nie ma innego polecenia rozpoczynającego się od my-script.

użytkownik23013
źródło