POSIX'in kabuk komut dosyalarına uyumluluğunu nasıl test edebilirim?


72

POSIX’in tüm birliklerde ortak bir standarda en yakın şey olduğunu göz önünde bulundurarak, yalnızca onu destekleyen bir kabuk olup olmadığını bilmekle ilgileniyorum. Çoğu modern kabuk POSIX için destek sağlarken (ve POSIX uyumlu komut dosyalarını sorunsuz çalıştıracaktır), uyumlu olmayan özellikleri işaret etmede iyi bir iş çıkarmazlar.

Yalnızca POSIX ve POSIX uygulayan, uyumlu olmayan herhangi bir özellik için hata yapacak şekilde herhangi bir kabuk var mı?

EDIT Taşınabilir kabuk komut dosyaları yazmak için genel ipuçlarını istemediğimi açıklığa kavuşturmak istiyorum. Yorumlarda bahsedilen ilgili soru zaten bunu kapsıyordu. Bunun bashbir --posixseçeneği olduğunu öğrendiğimde ancak sadece aradığım şey değil sadece bazı intializasyon davranışlarını etkilediğini keşfetmek için bu soruyu düşündüm .



@Gilles: Belki de bu soru ile karşılaştığımı söylemeliyim, ancak sadece bir cevap test etmeyi önerdi dash. Taşınabilirlikten soruma genel bir bağlam olarak bahsettim ama bu onun gerçek amacı değildi.
rahmu

Tabii, iki sorunun birbiriyle bağlantılı olmasını istedim, çünkü muhtemelen aynı insanlarla ilgileniyorlardı. Hiçbir şekilde kopyaları değiller. Bu arada, posh, POSIX uyumluluğu için dash'den daha iyi bir testtir.
Gilles

2
busybox yalnızca POSIX ve POSIX'e oldukça yakındır. Size yol açabilecek bir şey, diğer paketleri de (diffutils gibi) yüklüyorsanız özellikler eklemektir. Tamamen alpine linux'un canlı yayın ortamı olan meşgul bir ortama sahip olanı. Alpine musl C kütüphanesini kullanır, böylece genişletilmiş normal ifadeler gibi özellikler ekleyebileceğiniz GNU uzantılarını alamazsınız.
Michael Fox,

Yanıtlar:


37

Ne yazık ki, 'taşınabilir' genellikle kabuk komut dosyaları için 'POSIX uyumlu' durumundan daha güçlü bir gereksinimdir. Yani, herhangi bir POSIX kabuğunda çalışan bir şeyi yazmak çok zor değil, ancak gerçek dünyadaki herhangi bir kabuğunda çalışmasını sağlamak zordur.

Paket yöneticinize her kabuğu, özellikle de poshistediğiniz gibi debian seslerini (Politika uyumlu Olağan Kabuk) yükleyerek başlayabilirsiniz . Debian'ın politikası, birkaç istisna dışında POSIX'dir ( echo -nbelirtilen, local...).

Bunun ötesinde, testler bir dizi platformda birkaç mermiyi (özellikle de / bin / sh) kapsamalıdır. Solaris (/ bin / sh ve xpg4 / sh) ve BSD testlerini yapıyorum. AIX ve HP-UX çok uyumludur ve sorunlara neden olmaz. bash kendi başına küçük bir dünya.

Autoconf rehberini , kesinlikle mükemmel ve çok zaman kazandıran, taşınabilir mermiye tavsiye ederim . Büyük parçaları eski, ama sorun değil; sadece umursamıyorsanız TruUnix ve Ultrix ve benzerlerini atlayın!


poshGerçekten istediğim gibi geliyor. En kısa zamanda bazı testleri yapacağım.
rahmu

1
İlgili soruyu fark etmeden önce cevap verdim! Posh debian bir şey, bu yüzden her sistemde paketlenmiş olmayacak. Ayrıca, kabuğun mutlaka en çok endişelenmesi gereken şey değildir; Örneğin, uyumsuzluklar büyük bir problemdir.
Nicholas Wilson

Solaris / bin / sh aka Bourne kabuğuna (POSIX değil) taşınmaktan rahatsız olmazdım. Tüm modern Unix'lerde gibi Solaris sadece olağan bir konumda (/ usr / xpg4 / bin / sh) içinde olmamaya olur, bir POSIX kabuk vardır
Stéphane Chazelas

Ne yazık ki, en azından her / bin / sh komutunda çalıştırılması gereken komut dosyalarını göndeririz. O kadar da kötü değil ... Yine de yapmamayı tercih ederim.
Nicholas Wilson

2
Önemli / bin / sh olarak önemli davranmamın nedeni, birçok senaryoda shebang'dan çağrılmasından kaynaklanıyor. "/ usr / bin / env sh" bir gelişme değil. POSIX dışı mermilerde bir şeylerin çalışması için çaba sarf edecekseniz, her sistemin / bin / sh değerini önceliklendirebileceğimi düşünüyorum. Bazı müşterilerin betiğinizi varsayılan kabukla çalıştırması çok uzun sürmez, ki bu o kadar mantıksız değildir.
Nicholas Wilson

28

ShellCheck'i (GitHub) kabuk komut dosyalarınız için bir linter olarak kullanabilirsiniz . Ayrıca çevrimiçi bir versiyonu var .

POSIX uyumluluk sorunlarını tespit etmek için (örneğin SC2039 ), kabuk komut dosyanızın shebang satırı olmalıdır #!/bin/sh. Ayrıca geçebilir --shell=shiçin shellcheck.

Örnek ( test.sh):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

Sonuç ( shellcheck test.sh):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.

1
Bunca senedir ShellCheck'i hiç duymadım ... bağlantı için teşekkürler!
Ton van den Heuvel

Şimdiye kadar en iyi araç! Özellikle çevrimiçi bir sürüme sahip olmak, bir kod parçasını hızlıca kontrol etmek için harika!
Mecki

12

POSIXLY_CORRECTOrtam değişkeni ayarlanmışsa Bash POSIX uyumlu modda çalışacaktır . Manpage'den:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

Diğer birçok GNU yardımcı programı da onur duyacaktır POSIXLY_CORRECT; bu nedenle, ağırlıklı olarak GNU araçlarına (örneğin çoğu Linux sistemi) sahip bir sistemde iseniz, amacınız POSIX uygunluğu ise, bu iyi bir başlangıçtır.


21
POSIX modunda bile bash, POSIX gibi bazı özelliklere izin verir [[.
Ürdün
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.