Bir yürütülebilir dosyayı yalnızca ada göre çalıştırmak ve önüne bir nokta / eğik çizgi eklemek arasındaki fark nedir?


13

Bu ls -allkomutun çıktısıdır :

-rwxr----- 1 subhrcho dba  3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba  1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba   347 Mar  6  2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba   821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba   584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba  4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba  5047 Dec  6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe

Şimdi sadece çalıştırdığımda Oracle JDveloper'ınjdev farklı bir sürümünü çalıştırdığımda çalıştırıyorum .. Neden böyle?./jdev

Yanıtlar:


20

Yürütülebilir bir dosya (veya daha çok unix / linux dünyasında - yürütülebilir hakları / bayrağı olan bir dosya) aşağıdaki gibi çalıştırdığınızda:

$ ./jdev

daha sonra ., çalışma dizininizde (şu anda bulunduğunuz dizin) adlı jdevve dosyayı başlatan kullanıcı için yürütülebilir haklara sahip olan bir dosyayı çalıştırmak istediğinizi işaretlersiniz (bunun hala bir bağlantı olabileceğini unutmayın. başka bir dosyada, ls -l jdevterminali yazarak kontrol edebilirsiniz )

( linux / unix dosya izinlerine bakın )

Olarak çalıştırdığınızda

$ jdev

büyük olasılıkla jdevsistemde bir yere kurulur ve içinde $PATH(ör. /usr/bin/veya /bin/veya /usr/local/bin/)

As peterph şöyle demiştir: kullanabileceğiniz whichbelirli bir komut, örneğin piyasaya sürülmüştür yürütülebilir işaret etmek için:

$ which find
/usr/bin/find

1
Ayrıca, whichyardımcı program, hiçbir yol belirtilmezse hangi yürütülebilir dosyanın kullanılacağını size söyleyemez.
peterph

@peterph Cevabımı düzenledi.
Patryk

7
typeBelirli bir komutla neyin başlatıldığını kontrol etmek için kullanmak çok daha iyidir . Neden which$ PATH içinde bir yerde sadece bir ikili gösterecektir, ancak kesinlikle başka bir ikili dosyaya takma ad olabilir.
acele

@rush sadece o çalıştı ve bunu söylemez çalışmaları gibi: [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim. Sürezsoelim -> soelim
Patryk

2
@Patryk Bence acele which, bulma şansı olmayan kabuk takma adları / fonksiyonları anlamına geliyordu , çünkü çalışan kabuk ortamına erişimi olmayan bağımsız bir ikili (sadece diğer değişkenler değil takma adlar ve fonksiyonlar demek istiyorum) (bazıları miras alınır).
peterph

8

Kabukta adında eğik çizgi olmayan bir komutu çağırırsanız, kabuk diğer adlarında, işlevlerinde ve $PATHortam değişkeninde sağlanan yol listesinde aranır. (geçerli çalışma dizinine ( .veya boş dize olarak belirtilir ) veya ilgili herhangi bir dizine sahip olabileceğinizi unutmayın $PATH, ancak güvenlik nedeniyle bu önerilmez).

Adda bir eğik çizgi varsa, bu gerçekleşmez, ad, komutu yürütmek için bir yol olarak alınır (buna rağmen zsh, takma adların veya işlevlerin adlarında eğik çizgilere sahip olmasına izin verilir, bu da öncelikli olur).

Bu nedenle, foogeçerli çalışma dizininde bulunan adlı bir komutu çalıştırmak istiyorsanız, eğik çizgi içeren bir ad bulmanız gerekir. ./fooen açık olanıdır. Ayrıca tam yolu kullanabilir veya ../dir/foo...

Kabuğun ne çalıştığını bilmek için typekomutu kullanın. Genellikle düşündüğünüzü yapmayan ve yalnız bırakılan daha iyi bir miras olan whichkomutu kullanmayıncsh .


Neden "hangisi" değil "türü"?
Geek


doğru bağlantıyı sağladın mı?
Geek

Bu, bu sitede sık sorulan bir soru olduğunu kanıtlayan bir arama sonucudur. Bu soruların cevaplarının çoğu size neden kullanılmadığını söyleyecektir which. Örneğin, bkz. Unix.stackexchange.com/questions/16693/…
Stéphane Chazelas

2

$ PATH ;-) için diğer adların, kabuk yerleşiklerinin veya başka bir şeyin nasıl ve hangi sırayla bulunacağını görmek için Zsh'ın yerleşik 'where' ('hang' den daha iyi) kullanılmasını öneririm.

İşte şeyleri daha iyi anlamak için bir örnek, nasıl seçildi:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %

1

Bu muhtemelen kabuğunuza bağlı olsa da, kural genellikle:

  • Göreli veya mutlak bir yol sağlarsanız, bu yol kullanılır. ./jdevgöreceli bir yoldur, çünkü .mevcut dizini ifade eder (aslında, ls -all .size aynı olanı verir ls -all). Bunu yaparsanız /usr/bin/tool/, mutlak bir yol kullanıyorsunuzdur. Bu durumlarda, işaret edilen dosya yürütülür.

  • Bir yol sağlamaz, yalnızca bir ad sağlarsanız, içindeki dizinler $PATHçalıştırmaya çalıştığınız araç için aranır.

Geçerli dizinde, içindeki bazı dizinlerde bir dosya ile aynı ada sahip bir dosyanız $PATHvarsa ./ve adını adına ekleyerek çalıştırırsanız, etkin bir şekilde farklı bir dosya çalıştırırsınız.

Belki de başka bir sorun aslında jdevyürürlükteki dizinde çalıştırılabilir çalıştırmayı bekliyordunuz . Değiştin sürece $PATHdahil etmek ., bu hiç beklemeliyim şey değildir ...

... ve .oraya dahil etmek hala iyi bir fikir değil , eğer bunu yaparsanız lütfen en azından sonuna koyun, böylece geri kalanı $PATHher zaman önce aranır - sadece paylaşılan bir ağ dizininde olduğunuzu hayal edin ve birisi orada kötü bir ikili koymak karar lseğer $PATHile başlar ., basit bir ls -lahsistem saldırmak için yeterli olacaktır.


Terminolojiniz kafa karıştırıcı. jdevtek başına da göreceli bir yoldur. Kural şudur: eğik çizgi içermiyorsa, diğer adlarda, işlevlerde aranır ve $PATHaksi takdirde doğrudan dosya sisteminde aranır (ancak bazı kabuklar, adlarında / olan diğer adlara veya işlevlere izin verir; precendence).
Stéphane Chazelas
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.