“Sh” “/ bin” dizininde olmalı mı?


16

POSIX uyumlu işletim sistemlerinin (örneğin: Linux) shkabuğuna sahip olması gerektiğini okudum .

Ama için gerekli sholması /bindizin veya herhangi bir dizinde olabilir?


/bin/shÇoğu zaman linux'da zaten bir symlink olduğu için her zaman bir symlink kullanabilirsiniz bash. Sadece çok sayıda komut dosyası sabit /bin/sh
kod

5
Artık istediği her yerde yaşayabileceği cevabına sahip olduğunuza göre, kendinize sorabilirsiniz: Daha sonra portably bir shebang satırını nasıl yazabilirsiniz sh? Ve cevap: shebang da POSIX'in bir parçası değil, bu yüzden problem bile kendini göstermiyor.
Jörg W Mittag

1
@ JörgWMittag Evet, bazen "standart" Unix özellikleri olarak düşündüğümüz şeylerden kaç tanesinin POSIX tarafından gerekli olmaması şaşırtıcı olabilir.
Barmar

1
Bir shebang kullanıp kullanmayacağınız, yolun /bin/shbir POSIX sisteminde var olup olmayacağından bağımsızdır .
chepner

En azından Ubuntu kaynaklı sistemlerde, /bin/shbir bağlantıdır dash. BSD'lerde, /bin/shbir bağlantı değil, ayrı bir yürütülebilir dosya ve kesinlikle değil bash.
Rhialto, Monica

Yanıtlar:


22

POSIX sadece zorunlu kılan /devve /tmpvar olmaya dizinleri ve /dev/null, /dev/ttyve /dev/consoledosyaları. Standart yardımcı programların bulunması gerekir, ancak belirli bir konum belirtilmez. Hiç a olmayabilir /binve varsa a içermeyebilir shve eğer varsa POSIX olmayabilir sh.

Aşağıdaki komut ile birlikte PATHPOSIX araçlarını içeren geçerli bir değişken alabilirsiniz :shgetconf

$ PATH=$(getconf PATH)
$ sh

Bu, örneğin varsayılanın shPOSIX uyumlu olmadığı , ancak uyumlu bir shşekilde sağlandığı ve erişilebilir olduğu Solaris için yararlı olabilir ( Solaris sertifikalı bir Unix olduğu için ). getconf PATHiçerecektir /usr/xpg4/binPOSIX içeren ön en shve (diğer gerekli araçları bir dizi gibi gereksiz da dahil olmak üzerecd ).


Re Solaris: ... POSIX araçlarının çoğunu atlayan bir Solaris "küçük sunucu" kurulumu çalıştırmadığınız sürece. Bkz. Unix.stackexchange.com/q/360359/135943
Wildcard

"Yararsız" olanlar? Onlara fazlalık demeyi tercih ederim.
Mukesh Sai Kumar

2
peki getconf nasıl bulunur?
Joshua

@MukeshSaiKumar tek başına bir 'cd' komutu hiç çalışamaz
OrangeDog

Peki, sadece bir dizinde değişiklik yapıp yapamayacağınızı sınayan , ancak aslında orada çağıran işlemi bırakmayan bir çalışma değeri için "çalışacaktır" . Yine de, bu hiç olmadığı kadar işlevseldir.
Charles Duffy

12

Hayır, içeri shgirmek gerekli değildir /bin. Bu açıkça değinir /bin, /usr/binve /usr/xpg4/binolası konumları gibi. POSIX spesifikasyonu yalnızca PATH'de olmasını gerektirir sh.

POSIX Spec devletler:

Uygulamalar kabuğuna standart PATH olarak kabul edilemez ya dikkat etmelidir /bin/shya /usr/bin/shve döndürülen yol adı mutlak yol adı değil yerleşik bir kabuk olmasını sağlamak, getconf PATH tarafından döndürülen PATH sorgulanması belirlenmelidir.

Örneğin, standart sh yardımcı programının konumunu belirlemek için:

command -v sh

Bazı uygulamalarda bu geri dönebilir:

/usr/xpg4/bin/sh


2

Buradaki diğerlerinin söylediği gibi, POSIX uyumluluğu için bu kesinlikle gerekli değildir.

Ancak mevcut yazılımlarla tartışmalı uyumluluk çok daha önemlidir (sonuçta, POSIX'in amacı, tüm uyumlu işletim sistemlerinde belirli şeylerin çalışmasıdır) ve bir işletim sistemi sh sağlamazsa /bin/sh, bazı şeyleri kıracaktır.

En açık şekilde, #!/bin/shbu yola güvenen komut dosyaları standartlaştırılmıştır. Bunun çalışması gerekli değildir; POSIX, #!bu tür işlevlerin yaygın olduğunu belirtmesine rağmen , hatların desteklenmesini bile gerektirmez :

Bazı tarihsel uygulamaların kabuk betiklerini ele almasının başka bir yolu, dosyanın ilk iki baytını "#!" Karakter dizesi olarak tanımaktır. ve yürütülecek komut yorumlayıcısının adı olarak dosyanın ilk satırının geri kalanının kullanılması.

Ancak bu desteklenmiyorsa, mevcut yazılımların birçoğu bağlantı noktasına geçecek veya ek iş gerektirecektir.

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.