Taşınabilir kabuk programlama için kaynaklar


65

Taşınabilir kabuk programlama için hangi kaynaklar var? Nihai cevap hedeflenen tüm platformlarda test etmektir, ancak bu nadiren pratiktir.

POSIX / Tek UNIX şartname bir başlangıçtır, ancak her uygulama desteğinin seviyesi ne olduğunu ne söyler, ne de ortak hangi uzantıların mevcuttur. Her uygulamanın belgelerini okuyabilirsiniz, ancak bu çok zaman alıcı ve tam olarak doğru değil.

Bana göre ideal bir format, POSIX özelliklerinin bir çeşit topluluk açıklamalı versiyonu olacak ve her özelliğin farklı uygulamalar arasındaki destek seviyesine göre açıklanabileceğini düşünüyorum. Böyle bir şey var mı? Veya başka faydalı kaynaklar var mı?

Örneğin, Sven Mascheck'in kabuk taşınabilirlik sayfaları var , ancak bu sadece sözdizimsel öğeler ve birkaç yerleşik yapı hakkında ve sadece eski kabukları kapsıyor. Daha kapsamlı bir kaynak arıyorum.


2
Not: Lütfen yalnızca belirli bir uygulamanın uygunluk belgesine atıfta bulunmak için cevap vermeyin. Bunlardan birine sahipseniz, karşılık gelen wiki etiketi iyi bir yer olacaktır.
Gilles,

1
Birisinin revizyon tarihini autoconfve Metaconfig(Perl rn) revizyonunu yapması ve tüm hileleri ve açıklayıcı yorumlarını bir yerde toplaması gerekir.
geekosaur

@geekosaur: İyi öneri. Autoconf'un iç kısımlarına hiç bakmadım, birinin kendi komut dosyalarını yazarken rehber olarak kullanabileceği bir şey var mı? Eğer öyleyse, bu kesin bir cevap olmasa bile soruma iyi bir cevap olacaktır.
Gilles,

5
Her ikisini de kolayca bulabileceğinize eminim, ancak bu konuyu izleyen diğer kişilerin yararına, işte autoconf kılavuzundan alakalı bir sayfaya bağlantı: gnu.org/software/hello/manual/autoconf/Portable- Shell.html
J. Taylor

Yanıtlar:


32

Autoconf kılavuzu portatif kabuk programlamaya ilişkin bir bölüm içerir .

Her ne kadar özellikle POSIX’i hedeflemese de, taşınabilir kabuk kodu yazmaya çalışırken ne yapılması ve ne yapılmaması gerektiği konusunda en eksiksiz koleksiyondur.


3
En iyi kaynaklardan biri budur ve M4'te kod yazarken mümkün olduğunca çok sayıda mermi arasında taşınabilir bir kabuk kodu üretmek zorunda kaldı.
Tim Post

6

Ek olarak dashve posh, bournesh(veya bsh) Varsayımları tespit etmek için kullanılabilecek Heirloom Bourne Kabuğu var .

Heirloom Projesi ayrıca, 100'den fazla standart Unix yardımcı programından oluşan bir koleksiyon olan "Heirloom Toolchest" (komut satırı seçeneklerini karşılaştırmak için başlangıç ​​noktası olarak kullanılabilir) içermektedir.


2
Bourne kabuğunun bir POSIX kabuğu olmadığını, betiğinizi Bourne kabuğuna taşınabilir hale getirmenin, betiğinizin sözdizimini standart POSIX sh dilinden, bununla Bourne kabuğunun sözdizimi arasındaki ortak paydaya düşürmek anlamına geleceğini unutmayın. Eski sistemlere taşınabilir olmak istemediğiniz sürece (veya Solaris 10 ve önceki sürümlerinde ve / usr / xpg4 / bin dizininde bulunan standart sh'i kullanma seçeneğiniz yoksa) bu fikre değmez.
Stéphane Chazelas 4:15

5

Bu cevaba benzer şekilde , betiğinizi posh içerisinde çalıştırmayı deneyin .

Ayrıca, POSIXLY_CORRECTortam değişkenini true olarak ayarlamayı unutmayın ; bu, birçok programın (yalnızca kabuk değil) POSIX standartlarına daha katı şekilde uymasına neden olur.


4

Komut dosyalarınızı kısa çizgi kullanarak yazmak bir başlangıç ​​olabilir.


3
Dash ile test etmek ksh / bash özelliklerine yanlışlıkla güvenmekten kaçınmak için tamamen minimumdur, ancak bundan daha fazlasına sahibim: diğer kabuklardaki (ör. Zsh'ın kötü tuzak işleme) ve her şeyden önce kabuk hizmetlerinde (ör. OpenBSD'ler findhala ) eksiklikler hakkında bilmek uygulanmadı -exec +).
Gilles

FWIW, OpenBSD en finddoes -exec utility {} +bugünlerde.
Kusalananda

2

Biraz uzatmak checkbashismsiçin Debian / Ubuntu'nun devscriptspaketinde deneyebilirsiniz .

Mükemmel değil, ama var olan bir başlangıç ​​noktası olma avantajına sahip. Örneğin , GNU'ya karşı / BSD / diğer farklılıklarla sed/ arasında klasik aksaklıkları görmüyor find.

Varsayılan olarak, Debian + çizgi yönelimlidir, -pbayrak sizin durumunuz için faydalı olabilir.


2

Bugün, genellikle bir sistemde bir POSIX kabuğu bulabilirsiniz ve bu genel olarak POSIX dilinde kod yazabileceğiniz anlamına gelir (modulo uyumluluk hatalarına koşar).

Tek sorun, /bin/shbazen bir POSIX kabuğu olmamasıdır. Ve #!satırı, çalıştırılabilir dosyalar kadar iyi davranacak komut dosyalarına kodlamanız gerekir ; kullanıcıdan sadece sorunu araştırmasını ve komut dosyanızı şu şekilde çağırmasını isteyemezsiniz /path/to/posix/shell myscript.

Bu yüzden hile, betiğinizde POSIX özelliklerini kullanmak, ancak betiğin POSIX kabuğunu otomatik olarak bulmasını sağlamaktır. Bunu yapmanın bir yolu şöyle:

#!/bin/sh

# At this point, we may be running under some old shell
# we have to tread carefully.

# note how we use test rather than [ ] syntax and avoid
# depending on test with no argument producing a failure;
# i.e. "test $posix_shell".

if ! test x$posix_shell = x ; then
  # the three possible shell paths are just an example;
  # please extend as necessary.

  for shell in /usr/xpg4/bin/sh /bin/bash /usr/bin/bash ; do
    if test -x $shell ; then
       posix_shell=$shell
    fi
  done
  if test x$posix_shell = x ; then
    echo "no POSIX shell found"
    exit 1
    # or we could avoid bailing here and just fall back on /bin/sh:
    # echo "falling back on /bin/sh: cross your fingers that it works"
    # posix_shell=/bin/sh
  fi
  export posix_shell

  # plain "$@" is broken in ancient shells! 
  # I seem to recall ${@+"$@"}: not sure if that's the right trick.

  exec $posix_shell $0 ${@+"$@"}  # can we count on exec in legacy shells? 
fi

# phew, at this point in the script we have been re-executed and are
# being interpreted by some reasonably modern shell. We can use $(...)
# command substitution, and other features.

Kod oluşturma gibi başka yaklaşımlar da var. Komut dosyalarınızı bir # olmadan komut dosyası dosyalarını alan küçük bir komut dosyası ile güçlendirin! çizgi ve bir tane ekler.

Yapabileceğiniz en kötü şey, tüm betikleri 1981'den itibaren bir Bourne kabuğu üzerinde çalışacak şekilde yazmaya başlamaktır. Bu, yalnızca gerçekten başka bir kabuğu olmayan bir sistem için yazmanız gerektiğinde gereklidir. .

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.