Zsh'de komut dosyası çalıştırma - dosya izinleri


16

Beklediğim gibi davranmayan dosya izinlerini yürütme konusunda kafam karıştı. Muhtemelen beklentilerim yanlış olduğu için. Neyse:

Bir komut dosyası var, basitlik için sadece denir s, bulunur ~/bin. Bu örnek uğruna, dosya sadece aşağıdaki satırları içerir:

#!/bin/zsh
echo "Test";

Çok basit.

Ben gitmek ~/bindizine ve chmoddosya izinleri siçin 400- yani salt okunur sadece benim için. Yürütme izni yok. O zaman ben komut dosyasını yolunu girerek yürütmeyi deneyin, bu vererek:

% ./s
zsh: permission denied: ./s

Çok uzak çok iyi. Dosya yanlış izinler nedeniyle yürütülemiyor. 500(İzin verilen yürütme) değerine kadar çarpma izinleri de iyi çalışır - bu izinlerle dosya iyi çalışır:

% ./s
Test

Bunların hepsi beklendiği gibi. Ama sonra chmodgeri izin 400(tekrar kapalı izin yürütmek), sourcedosyayı denemek ve bu olur:

% source s
Test

İzinler olmasına rağmen 400, komut dosyası yürütülür.

Öyleyse sorum şu: neden ./sbaşarısız oluyor (olması gerektiği gibi) ama source snormal çalışıyor? Bu, yürütme izninin tüm amacını bozmaz mı?

At 400izinleri sh sve zsh sayrıca çalışır.

Eminim ya bir yerlerde korkunç bir yanlışlık yapıyorum ya da anlıyorum. Birisi noktası dışarı nerede bana Can ve arasındaki farkı açıklamak ./s, source s, sh sve zsh s?

Yanıtlar:


17

Çalıştırdığınızda ./s, çekirdeğe programı yürütmesini söylersiniz s. Yürütme izniniz varsa, çekirdek dosyanın ilk birkaç baytını okur, #!satırı görür, böylece bir komut dosyası olduğunu bilir ve yorumlayıcıyı çalıştırır ve komut dosyası adını ilk argümanı olarak iletir. Yürütme izniniz yoksa, çekirdek ilk adımda yürütmeyi iptal eder.

Çalıştırdığınızda zsh s, çalıştırırsınız zshve çağrılan dosyayı okumasını sve komut olarak yorumlamasını söylersiniz . Sen yürütmüyorsun s, yürütüyorsun zsh. sh sVeya ile aynı şey cat s.

source sTekrar çalıştırdığınızda , zsh'ye bir dosyayı okumasını söylersiniz, bu yüzden önemli olan onun üzerinde okuma iznine sahip olmanızdır.


Tamam, bu mantıklı. Ancak bu, yürütme iznine sahip olma noktasını tamamen yenmez mi? Ayarlanıp ayarlanmadığı önemli değil, her zaman komut dosyasını yürütebilirim (veya zsh'ye komut dosyasındaki eşdeğer komutları yorumlamasını söyleyebilirim).
C106

Ayrıca, cat ssadece dosyanın içeriğini yazdırır. cat s | zshonları geçirir zshve yazdırır Test.
C106

1
@ C106 Yürütme izninin noktası, dosyanın ek bilgi olmadan yürütebileceğiniz bir şeyi temsil ettiğini belirtmektir. Dosyanın setuid / setgid olması da önemlidir. Bir dosyanın yürütme izni olmayabilir, ancak yine de bir yerlerde bir bilgisayar programının yürütüldüğü yönergelerinden oluşur.
Gilles 'SO- kötü olmayı kes

Bu çok mantıklı ve aslında inanılmaz derecede açık. Teşekkürler.
C106
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.