POSIX neden harici bir uygulamaya sahip olmak için belirli kabuk yerleşiklerinin kullanılmasını gerektiriyor?


18

Gönderen Printf olup olmadığı hakkında bu soruya bir Yash için yerleşik- geliyor bu cevabı o tırnak POSIX standardı .

Yanıt, POSIX arama dizisinin istenen komutun harici bir uygulamasını bulmak olduğunu ve daha sonra kabuk yerleşik olarak uyguladıysa, yerleşik olarak çalıştırdığını gösterir. ( Özel yerleşik olmayan yerleşik öğeler için .)

POSIX, dahili bir uygulamanın çalıştırılmasına izin vermeden önce harici bir uygulamanın olması için neden bu gereksinime sahiptir?

Öyle görünüyor ki ... keyfi, bu yüzden merak ediyorum.


İsterseniz / istenirse yerleşikleri etkinleştirmek / devre dışı bırakmak için bir yol olduğuna inanıyorum.
Isaac

2
Harici uygulamayı kaldırarak yerleşik devre dışı bırakılsın mı? Artık ad komutları yok printf.
studog

@studog, bu nedenle yerleşik ile aynı ada sahip boş bir dosya oluşturun, yürütme bitini açın ve PATH'nizdeki bir dizine koyun. : P
Joker

@Wildcard Kesinlikle uyumlu bir kabuk, arama yaparken adı görür PATHve harici komut dosyasını değil, yerleşik yardımcı programı çağırır. Yolunuzdaki harici komut dosyasını çağırmak isterseniz ne olur? Hmm ... Bu, farklı olasılıkları açıklayan bir tablo gerektiriyor gibi görünüyor. Burada bir tane var , ama bu benim için anlamlı değil.
Kusalananda

@Kusalananda, ilk cümlenin, benim amacım buydu. Bu yüzden neden boş bir dosya oluşturduğumu söyledim .
Joker

Yanıtlar:


15

Bu "sanki" bir kuraldır.

Basitçe söylemek gerekirse: Bir uygulama, standart bir harici komutun yerleşik kabuk olarak da kullanılabilir hale getirilmesine karar verirse, kullanıcıların gördüğü şekliyle kabuğun davranışı değişmemelidir.

Https://unix.stackexchange.com/a/496291/5132 adresinde , bir yandan PD Korn, MirBSD Korn ve Heirloom Bourne mermilerinin davranışları arasında gösterdiğim kontrast ; (diğer yandan) Z, 93 Korn, Yine Bourne ve Debian Almquist mermileri; ve (sürükleyici elden) Watanabe kabuğu bunu vurgular.

Yok kabukları için printfbir yerleşik çıkarmadan /usr/bingelen PATHbir çağırma yapar printfçalışmamaya. Watanabe kabuğunun uygun modda sergilediği POSIX uyum davranışı aynı sonuca neden olur. Bir sahiptir kabuğun davranış printfyerleşik olduğu gibi harici bir komutu çağırarak bulundu.

Olmayan uyumlu tüm kabukların davranışı Oysa eğer değiştirmez /usr/binkaldırılır PATHve onlar do not onlar harici komutu çağırarak sanki davranır.

Standardın size garanti etmeye çalıştığı şey, mermilerin normalde harici komutların her türünü oluşturabilmesi (veya bunları kendi kabuk işlevleri olarak uygulayabilmesidir) ve yine de yerleşiklerden yaptığınızla aynı davranışı elde edersiniz. komutların PATHbulunmasını durdurmak için ayar yaparsanız harici komutlarla . PATHhangi komutları çağırabileceğinizi seçmek ve kontrol etmek için aracınız kalır.

( Https://unix.stackexchange.com/a/448799/5132 adresinde açıklandığı gibi , yıllar önce insanlar olanları değiştirerek Unix'lerinin kişiliğini seçtiler PATH.)

Komutun bulunup bulunamayacağına bakılmaksızın her zaman çalışmasını PATH sağlamak aslında normalde harici komutları yerleşik hale getirme noktasıdır . (Bu yüzden nosh araç setim printenvaslında 1.38 sürümünde yerleşik bir komut kazandı . Bu bir kabuk olmamasına rağmen .)

Ancak standart size, işlevi başlatan diğer kabuk dışı programlardan göreceğiniz gibi kabuktan alınmayan normal harici komutlar için aynı davranışı göreceğinizi garanti eder ve kabuk sihirli bir şekilde yapamaz. diğer programların bulamadığı sıradan harici komutları çalıştırın (görünüşte) . Her şey kullanıcının bakış açısından kendi kendine tutarlı bir şekilde çalışır ve nasıl çalıştığını kontrol etmek için bir araçtır.PATHexecvpe()PATHPATH

daha fazla okuma


13

Bu oldukça saçma ve bu yüzden varsayılan modda hiçbir kabuk uygulamıyor.

Standardın gerekçe ve gösteren örnek bu var bir beceriksiz girişimi olduğunu düşündürmektedir düzenli kendi ikili bundan önceki görünmesini sağlayarak kullanıcı erişim engelleme onu bir yolla bağlantılı ve izin yerleşik PATH(örn. Bir printfdahili ilişkili harici komut tarafından ayarlanarak /usr/bin/printfgeçersiz kılınabilir )./foo/bin/printfPATH=/foo/bin:$PATH

Bununla birlikte, standart bunu gerektirmedi, ancak tamamen farklı bir şey (ve ayrıca işe yaramaz ve beklenmedik).

Bu hata raporunda daha fazla bilgi edinebilirsiniz . Kabul edilen son metinden alıntı :

Mevcut birçok uygulama, PATH araması yapmadan düzenli bir yerleşik yürütür. Bu davranış, normatif metinle eşleşmez ve komut dosyası yazarlarının özel olarak hazırlanmış bir PATH aracılığıyla normal yerleşik yardımcı programları geçersiz kılmasına izin vermez. Ek olarak, mantık, niyetin yazarların PATH'yi değiştirerek yerleşikleri geçersiz kılmalarına izin vermek olduğunu açıklar , ancak normatif metnin söylediği bu değildir .

FWIW, kabul edilen metnin gözden geçirilmiş gereksinimlerini de uygulayan bir kabuk olduğunu sanmıyorum.




Hayır, (örn. / Usr / bin / printf ile ilişkili bir printf yerleşik / foo / bin / printf harici komutuyla PATH = / foo / bin: $ PATH ayarlanarak geçersiz kılınabilir). , bu yanlış. Ya da varlığı / iki / herhangi /usr/bin/printfveya /foo/bin/printfYOLU aktive olacak yerleşik printf. Eksik olan (PATH'de) harici olanın printfyapacağı tek şey yerleşik olanı devre dışı bırakmaktır. ( Spesifikasyonun mektubu ile).
Isaac
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.