Apakah ada yang setara dengan Unix dari variabel lingkungan Windows PATHEXT


11

Saya bertanya-tanya apakah ada yang setara dengan Unix untuk variabel lingkungan Windows PATHEXT.

Bagi mereka yang tidak memiliki latar belakang Windows: Menambahkan akhiran file PATHEXTmemungkinkan saya untuk menjalankan skrip tanpa mengetikkan akhiran itu di cmd.exe. Sebagai contoh, di komputer Windows saya, PATHEXT berisi akhiran .pldan ketika saya ingin menjalankan skrip Perl di cmd.exe, saya cukup mengetik my-scriptdan dijalankan. Namun, dalam rangka untuk menjalankan script yang sama di bash, saya harus menulis nama lengkap: my-script.pl.

Karena saya bekerja pada Windows dan Unix saat ini, saya hampir selalu jatuh ke dalam perangkap lupa mengetikkan akhiran ketika pergi ke kotak Unix lagi.


Akan menarik untuk mengetahui apa yang dilakukan Windows jika PATHEXT berisi, misalnya, .sh dan .pl dan Anda mencoba menjalankan 'foo' dalam direktori dengan foo.sh dan foo.pl di dalamnya.
Jeff Schaller

Jika .shdidahului .pl, foo.shakan dijalankan. stackoverflow.com/a/7839178/180275
René Nyffenegger

Jawaban:


7

singkat: tidak

lebih lama: skrip shell memerlukan nama file lengkap, tetapi Anda dapat menentukan alias untuk perintah Anda untuk merujuknya dengan berbagai nama. Sebagai contoh

alias my-script=my-script.pl

12

Solusi paling sederhana adalah tidak menggunakan ekstensi untuk skrip Anda. Mereka tidak perlu dan hanya berfungsi untuk mengidentifikasi jenis skrip untuk Anda, tetapi tidak untuk komputer. Sementara Windows menggunakan ekstensi untuk mengidentifikasi jenis file, sistem * nix (dengan sangat sedikit pengecualian seperti gzip) tidak.

Perhatikan bahwa binari tidak memiliki .exeekstensi di * nix, hanya dipanggil foo, tidak foo.exe. Jadi, jika Anda ingin foo.pldapat dieksekusi sebagai foo, cukup simpan file seperti foodi tempat pertama.

Atau, jika Anda benar-benar perlu memiliki ekstensi untuk beberapa alasan, masuklah ke direktori apa pun yang Anda simpan skrip Anda dan jalankan ini:

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

Itu akan mengulangi semua file dengan ekstensi dan, untuk setiap file foo.ext, akan membuat tautan yang disebut ke foomana foo.ext. Perhatikan bahwa ini akan gagal jika Anda memiliki banyak skrip dengan nama yang sama tetapi ekstensi berbeda.


7

Jika Anda benar-benar ingin melakukannya, ada caranya. Tambahkan yang berikut ini di akhir .bashrcdirektori home Anda, dan setel PATHEXTke nama ekstensi dengan titik-titik yang dipisahkan oleh :. (Diubah untuk memasukkan titik-titik yang sesuai dengan perilaku Windows.) Gunakan dengan risiko Anda sendiri.

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
}

Juga ingat bahwa Anda dapat menggunakan tab untuk melengkapi nama perintah jika tidak ada perintah lain juga dimulai dengan my-script.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.