Windows ortam değişkeni PATHEXT'in Unix eşdeğeri var mı


11

Windows ortam değişkeni için bir Unix eşdeğeri olup olmadığını merak ediyorum PATHEXT.

Windows arka planı olmayanlar için: PATHEXTcmd.exe dosyasına bu soneki yazmadan bir komut dosyası yürütmemi sağlayan bir dosya soneki eklemek . Örneğin, Windows bilgisayarımda, PATHEXT soneki içeriyor ve .plcmd.exe'de bir Perl betiği yürütmek istediğimde, yazabilirim my-scriptve çalıştırılır. Ancak bash aynı senaryoyu yürütmek amacıyla, tam adını yazmak gerekir: my-script.pl.

Şu anda hem Windows hem de Unix üzerinde çalıştığım için, neredeyse her zaman bir Unix kutusuna giderken soneki yazmayı unutma tuzağına düşüyorum.


PATHEXT, örneğin .sh ve .pl içeriyorsa Windows'un ne yaptığını bilmek ilginç olurdu ve foo.sh ve foo.pl içeren bir dizinde 'foo' çalıştırmayı denediniz.
Jeff Schaller

Eğer .shpreceedes .pl, foo.shişletilecek. stackoverflow.com/a/7839178/180275
René Nyffenegger

Yanıtlar:


7

kısa: hayır

daha uzun: kabuk komut dosyaları için tam bir dosya adı gerekir, ancak komutlarınızın bunlara çeşitli adlarla başvurması için takma adlar tanımlayabilirsiniz. Örneğin

alias my-script=my-script.pl

12

En basit çözüm, komut dosyalarınız için uzantıları kullanmamaktır. Bunlar gerekli değildir ve yalnızca komut dosyasının türünü tanımlamaya hizmet eder, ancak bilgisayara değil. Windows dosya türünü tanımlamak için uzantılar kullanırken * nix sistemleri (gibi çok az istisna dışında gzip) kullanmaz.

.exe* Nix'te ikili dosyaların uzantısının olmadığını unutmayın, sadece denir foo, değil foo.exe. Bu nedenle, foo.plyürütülebilir gibi olmak istiyorsanız foo, dosyayı fooilk etapta olduğu gibi kaydetmeniz yeterlidir .

Alternatif olarak, gerçekten bir nedenle uzantılara sahip olmanız gerekiyorsa, komut dosyalarınızı kaydettiğiniz dizine gidin ve bunu çalıştırın:

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

Bu, uzantıları olan tüm dosyalar üzerinde yinelenir ve her bir dosya için hangi noktaya işaret eden foo.extbir bağlantı oluşturur . Aynı ada ancak farklı uzantılara sahip birden fazla komut dosyanız varsa bunun başarısız olacağını unutmayın.foofoo.ext


7

Gerçekten yapmak istiyorsan, bir yolu var. Giriş .bashrcdizininizin sonuna aşağıdakileri ekleyin ve PATHEXTnoktalarla ayrılmış uzantı adlarına ayarlayın :. (Windows davranışına uygun noktaları içerecek şekilde değiştirildi.) Bunu kullanmak kendi sorumluluğunuzdadır.

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
}

Ayrıca başlayarak başka bir komut yoksa komut adını tamamlamak için sekmeyi kullanabileceğinizi unutmayın my-script.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.