Linux için en evrensel kodlama dili?


24

Linux sistemleri için senaryolar yazıyoruz, evrensel olarak en çok kullanılan Linux betik dili ne olacağı konusunda bazı tartışmalar oldu. Bash, SH, Posix? Ne?


3
Tahmin ediyorum sh.
Blender

Hedef dağıtımların bir listesi var mı? Veya üzerinde çalışması gereken zorunlu / arzu edilen dağıtımlar?

4
"sh"? Ne "sh"? Thomson kabuğu? Bourne kabuğu? bash, ksh, pdksh, ash, x veya Y/bin/sh sistemindeki gibi zsh ? POSIX sh özellikleri, SUSv3, SUSv4 sh özellikleri, LSB sh özellikleri? "sh" kendi başına bir şey ifade etmiyor.
Stéphane Chazelas 26:12

1
Bu yazılımlar için komut dosyaları oluşturup yüklüyse, sistemler arası derleme sorunlarını çözmeye çalışan Otomatik Araçlar'ı incelemek isteyebilirsiniz.
Yalan Ryan

1
@sch En taşınabilir ortak kavşak, "açıkçası". Unix mermilerine aşina olmayan kişilerin yorumunuzdan yanıltılması durumunda, POSIX spesifikasyonu, adından geçmeye cesaret eden neredeyse tüm çağdaş mermiler ve bugünlerde eski ve nadir sholmayan uyumsuzluklar sh(örneğin Bourne) tarafından uygulanır. Kişi sürekli büyüyen bir uzantı ve çeşitlilik listesine girebilir, ancak amaç “evrensel” veya taşınabilirlik ise, ters yönde ilerlemek gerekir. Gilles'un cevabı detayları daha derinlemesine ele alıyor.
jw013

Yanıtlar:


38

Her unix benzeri işletim sisteminde mevcut olan ve Turing tamamlanmış ve diğer programları çağırabilecek iki programlama ortamı vardır: awk ve sh , Bourne / POSIX kabuk ailesi. AWK, metin işlemeye yöneliktir (daha özel hizmetleri tamamlar), sh programları bir araya getirmek için bir tutkal dili olma yolundadır. Sh olan Linux üzerinde ve Unix dünya çapında evrensel kodlama dili.

POSIX standart sh kendisi ve ilgili araçlardan zorunlu özellikleri tanımlamaktadır. Unix benzeri sistemlerin çoğu POSIX 1003.1-2004 ile uyumludur (aka Single Unix v3, aka Açık Grup Temel Şartnamesi 6); bu standardın en son sürümü POSIX 1003.1-2008'dir (aka Single Unix v4, aka Açık Grup Temel Şartnamesi Sayı 7).

Her Linux ve unix veya Unix benzeri sistemin yolunda Bourne tarzı bir kabuk vardır /bin/shve antik olmayan herhangi bir sistemin POSIX uyumlu bir kabuğu vardır (zaman zaman böceği engeller). Her modern unix benzeri sistem (Linux dahil) shebang'ları destekler , böylece /bin/shilk satırda otomatik olarak komut dosyalarını çalıştırır #!/bin/sh. shBaşka bir yerde bulunan POSIX sistemleri var (tipik olarak Unix'e benzemediğini düşünmeyeceğiniz OS'lardaki öykünme katmanları).

Gömülü Linux sistemleri, tüm POSIX özelliklerini uygulamayan soyulmuş bir BusyBox sistemine sahip olabilir. BusyBox, az yer kaplayan sistemleri barındırmak için çok sayıda derleme zamanı seçeneğine sahiptir, bu nedenle önceden ne olacağını bilmek zordur, komut dosyalarınızı belirli bir cihaza göre uyarlamanız gerekir. BusyBox, sh ve çeşitli uygulamaların en yaygın kullanılan küçük ayak izi uygulamasıdır; Karşılaşabileceğiniz bir diğeri de Android'de aşırı derecede azalan kabuk ortamıdır (sonraki sürümler daha az anemiktir).

Sigara gömülü Linux sistemler hemen her zaman ya sahip tire veya bash olarak /bin/sh. Dash, POSIX özelliklerinden biraz daha fazlasını uygulayan küçük ve hızlı bir kabuktur. Bash, daha fazla özelliğe sahip daha büyük bir kabuktur.

Gömülü olmayan Linux sistemlerinde hemen hemen her zaman Bash yüklü olarak bulunur /bin/bash. Bu nedenle, gömülü olmayan Linux sistemlerinde taşınabilirlik için bash'ın kullanılabilir olduğunu varsayabilirsiniz. Bash'ın yararlı ek özellikleri arasında diziler, nokta dosyaları ile rahatça başa çıkma kabiliyeti pipestatus, bir boru hattındaki tüm komutların geri dönüş durumunu elde etme değişkeni, dosya zamanları için ek karşılaştırma işleçleri ve (son sürümlerde) düzenli ifade eşleştirmesi vardır. .

Kabuk programlamanın özelliklerinden biri, sadece shprogramı kullanmamanız, aynı zamanda çok sayıda yardımcı program kullanmanızdır . Linux'taki dosya işleme ve metin işleme araçlarının çoğu GNU coreutil'leridir (gömülü sistemlerde, genellikle BusyBox'tan geliyorlar).

Linux ötesinde taşınabilirliğe ihtiyacınız varsa, en iyi seçeneğiniz POSIX'e bağlı kalmaktır. Diğer unix varyantlarında bash kurulu olmayabilir (bash OSX'deki standart kurulumun bir parçasıdır, ancak * BSD ve çoğu ticari ünitede isteğe bağlı bir pakettir). Neredeyse Linux ve OSX dışındaki tüm unix varyantları (örn. * BSD ve ticari birlikler) en azından pdksh olan Korn kabuğunun bir versiyonuna sahiptir . Bash'ın uygun uzantılarının çoğu ksh'dandır, bu nedenle her ikisinin altında çalışan scriptler yazmak faydalı olabilir, ancak bash veya ksh'ın bilinmeyen bir sistemde nerede olduğunu tespit etmek biraz acı verici olabilir.

Kabuk her şeyi yapamaz. Daha karmaşık bir dile ihtiyacınız varsa, daha yaygın olan iki seçenek Perl ve Python'dur (başka bir şey unix betik dili olarak çok geridedir). Perl, geleneksel kodlama dilidir ve gömülü olmayan Linux sistemlerinden az bir kısmı onu kullanmaktadır, ancak Python (Ubuntu için önerilen kodlama dili olarak kısmen güçlendirilmiştir) temel kazanmaktadır. Linux olmayan dünyada Perl, OSX ve OpenBSD'deki temel kurulumun bir parçasıdır; isteğe bağlıdır ancak çok yaygın olarak FreeBSD'ye kurulur ve isteğe bağlı ancak sıklıkla NetBSD'ye kurulur.


1
"kısmen güçlendirilmiş ..." Bu ve Fedora ve RHEL sistemlerinde hepsi zorunlu olmak.
Ignacio Vazquez-Abrams

Bütün bunlara çoğunlukla katılıyorum. Sadece bazı farklı vurgulamalar: * bazı dağıtımlar BusyBox tabanlıdır ancak zorunlu olarak gömülü değildir (bir tane Alpine kullanıyorum). (Verilen cevap vermez "hemen her zaman" derler.) * BSD büyük sınıfıdır Unix benzeri varsayılan olarak bash kabul edemeyiz sistemleri. * Dash, bash'ın yapabileceği hemen hemen her şeyi yapabilir, sadece bazen daha fazla bakım gerektirir. * Daha karmaşık bir dile ihtiyacınız varsa, evet Perl ve Python en yaygın seçimlerdir, ancak awk daha da yaygındır ve birçok amaç için yeterlidir. Aynı zamanda yaygın olarak hafife alınmaktadır. Ancak Perl ve Python'dan daha hafif.
dubiousjim

2
Adil bir uyarı olsa da, FreeBSD bir süre önce varsayılan kurulumundan Perl'i düşürdü. Bunun dışında, temel kurulumlarında Perl bulunmayan başka bir dağıtım bilmiyorum.
TC1

@ TC1 Perl, NetBSD'de her zaman isteğe bağlıydı. OpenBSD'deki temel sistemde.
Gilles 'SO- kötülük olmayı'

@dubiousjim Sadece Linux (gömülü olmayan veya pratikte yeterince iyi bir yaklaşım) ve OSX varsayılan kurulumlarında baskıya sahiptir; * BSD'de pdksh veya mksh, ticari birliklerde ATT ksh bulunur.
Gilles 'SO- kötülük olmayı'

11

Uygunluk sırasına göre:

  1. sh, ancak POSIX tarafından belirtilen tesislere bağlı kalın.
  2. bash, ama açıkça onu shebang içinde belirtmeyi unutma yoksa bunun yerine çizgi alabilirsin.
  3. Python. Neredeyse herkes kullanır.
  4. Perl. Ama sen yazarsın.

Ondan sonra kimse gerçekten umursamıyor, çünkü sadece bunlarla yapamayacağınız çok şey yok.


10
PERL'i python'dan önce koyardım, çoğu linux sistemde varsayılan olarak kurulur.
terdon

4
Perl # 3. Ve yazacaksın, bonus! :)
Warren Young

2
@İgnacio perl # 4 ve python # 3 ile aynı fikirdeyim. Sebep açıktır. Python'un perl'in evrimi olduğunu düşünüyorum.
bagavadhar

5
@ ashwin: hayır, python perl'in bir evrimi, hatta benzeri değildir. perl, sysadmins için sysadmins tarafından kullanılan bir dildir. python, programcılar için programcılar tarafından kullanılan bir dildir. Bu fark çok önemlidir. Her ikisi de kendi kullanım alanlarına sahiptir ve kullanım durumlarında çok fazla örtüşme olabilirken, bazı görevler daha iyi bir seçimdir ve diğerleri için python açıkça üstündür.
cas

1
Ruby ve PHP Perl'den ilham aldı. Python, bir süperkolektörde anti-Perls oluşturdukları bir fizik deneyinin sonucudur. (Python'a karşı hiçbir şeyim yok. Artılar ve eksiler, artılar ve eksiler.)
Warren Young

4

Normalde, derdim ki sh.... ama Linux’u belirttiğinden beri, söyleyeceğim bash- etrafta her Linux sisteminde olması garantilidir (peki, minimalizmi fetiş yapan belirsiz, küçücük olanlar hariç :).

Linux olmayan taşınabilirliği önemsemek zorunda kalmazsanız (ve küçük dağıtımlarda veya plastik kutu yönlendiriciler gibi gömülü Linux aygıtlarında çalıştırmanız gerekmiyorsa), bu geliştirmelerden de yararlanabilirsiniz. düz üzerinden sunar sh. Aksi takdirde kullanın sh.

bash(Ve sh) 'den sonra , Linux için bir sonraki en "evrensel" betik dili bir awkya mawkda bazı lehçeler olurdu - genellikle ya da gawk. Düz awk ile takılırsanız ve kötü niyetli yazılımlardan kaçınırsanız, komut dosyanızın hemen hemen tüm Linux sistemlerinde iyi çalışması gerekir (küçük dağıtımlarda veya gömülü aygıtlarda eksik olabilir). Çoğu Linux sistemleri ikisine de sahip olacak mawkve gawkmevcut, ancak bazı dağıtımlar (örneğin debian) üzerinde mawkvarsayılan olarak yüklenir ve yüklemek zorunda gawkeğer istersen kendin.

Sıradaki olur perl. AFAIK, temel perl dili varsayılan olarak tüm Linux dağıtımlarına yüklenir, bu da onu iyi bir seçim haline getirir. Daha da iyisi, perl5 sürümleriyle çok az sürüm uyuşmazlığı var (perl 5.12 veya 5.14 olmasına rağmen nihayet 15 yıldan beri kullanımdan kaldırılan bazı belirsiz özellikleri kaldırmamaya başlamış olabilir). Kodlama stiliniz gerçekten garip değilse ve on yıldan fazla bir süredir "bunu yapma" uyarısı almazsanız, perl komut dosyalarınız neredeyse her yerde iyi sonuç verir. Dil sağlam ve güçlü olduğunu ve her şeyi yapabilirsiniz awkve seddaha yapabiliriz ve. Küçük bir çaba ile o şeyler yapabilirshgeleneksel olarak da iyidir (örneğin harici komutları çalıştırmak ve çıktıyı kullanmak / piping). Standart perl kütüphaneleri de oldukça kapsamlı - sadece temellerden daha fazlasını kapsıyor.

Perl ile yakalanan tek şey, aklınıza gelebilecek herhangi bir şey (ve sizin için asla gerçekleşmeyecek birçok şey) yapmak için muazzam bir CPAN modül kütüphanesi olduğudur - ve hepsi perl ile her sistemde mevcut olmayacaktır. . Genellikle çok yüksek kalitededirler, bu yüzden sadece onları kullanma alışkanlığına alışmak kolaydır - ama onlardan faydalanırsanız, kurulu olduklarından emin olmalısınız. Çoğu CPAN modülü Linux için önceden paketlenmiştir ve kalanlar cpan aracıyla (veya dh-make-perlbir CPAN modülünü .deb paketine dönüştürmek için debian / ubuntu / etc) kolayca kurulur.

Bir pythonsonraki söyleyebilmek isterdim ama gerçekten yapamam. Python hakkında hoşlanacak çok şey var ama pek çok Linux sistemine varsayılan olarak dahil edilmedi ve açıkçası, sürüm uyumluluğu (hem python için hem de iddia edilen "standart" lib'ler için) tam bir kargaşa. Bazı dağıtımlar, dağınıklığı gidermek için mükemmel çaba gösterir, bazıları dağıtmaz. Python'un temelde programcılar tarafından programcılar (sysadmins'e göre) tarafından yazılmış programcılar için yazılmış bir dil olduğu ve kodlarının yükleneceği sistemin hiç önemli olmadığını düşündükleri görülmüyor. gerçekten çok özeldir, bu yüzden var olan sistemlere entegrasyon gibi sıkıcı şeylerle ilgilenmeleri gerekmez.

(Buradaki alaycılığımdan yanlış bir fikre kapılmayın - Python'u bir dil olarak çok seviyorum, sadece sürüm ve bağımlılık yönetiminin bir PITA olduğu gerçeğinden nefret ediyorum. özel bir şey için derlenmiş ve çalışan bir şey elde etmek için kod ve yamalar * *


Bu eski bir yazı olduğunu biliyorum, ama bu atlatmanın en iyi yolu belirtmektir shebang hangi sürümü (örneğin /usr/bin/python2, /usr/bin/python3).
Isiah Meadows

1

Ksh93 veya hatta POSIX lezzetini izlemenizi öneririm ve çalıştırmak için her zaman bash / zsh kullanabilirsiniz.

Ve Debian-tabanlı dağıtım, mawk'u varsayılan awk olarak kullanmadı. Bu yüzden, evet çok hızlı eklemeler yapmaktan kaçınmalıdır.


0

Kesmek değil. Kısa çizgi ya da kül gibi POSIX'e yakın bir yere yazın. Bu en evrensel olacak. Yakın bir rakip bile olan başka bir şey olduğunu sanmıyorum. (Ve bu bana, yorumculardan birinin şikayet ettiği gibi "fikir" değil gerçek bir soru gibi geliyor.)

Sh'tan biraz daha güçlü bir şeye ihtiyacınız varsa (örneğin, gerçek ilişkisel dizileri istiyorsanız), awk kullanın. (Gawk uzantılarını kullanmaktan kaçının. Awk'ın pek çok sürümü var, ancak büyük ölçüde paylaşılan bir çekirdek var.


1
awk-on-Linux evrensel olarak korkaktır; Varsayılan olarak başka bir değişkeni olan herhangi bir dağıtımı düşünemiyorum.
Ignacio Vazquez-Abrams

5
Hangi Linux değişkenleri desteklemiyor bash?
Jonathan Leffler

1
Kesinlikle bashherhangi bir Linux kutusuna (neredeyse) kurulabilir ve çalıştırılabilir, ancak birçok debian kullanıcısı sadece kuracak dashve kurmamayı tercih edecektir bash.
William Pursell

6
@WilliamPursell Bash paketi Debian'da Essential olarak etiketlendi (yani, sisteminizi hortumlayacağına dair bol miktarda uyarıyla çıkarmak için çemberlerden geçmek zorundasınız). Bash gömülü olmayan Linux sistemlerinde neredeyse evrenseldir.
Gilles 'SO- kötülük olmayı'

1
@JonathanLeffler: Gömülü olanlar tersine yalnızca Busybox içerebilir.
Mekanik salyangoz,

0

Kullanılabilirliğin bu sırada bir yerde sıralanacağını söyleyebilirim:

  1. sh
  2. awk
  3. Perl (BSD'ler de dahil olmak üzere onsuz bir * nix görmedim)

Python iyi bir dil gibi görünse de, görünüşe göre Ubuntu belki de olsa, temel kurulumda beraberinde gelen bir işletim sistemi kullanmadım.


0

Buradaki uzmanların karar vermenize yardımcı olacak harika öneriler sunduğunu düşünüyorum. Farklı mermilerin kullanılabilirliği ve kullanılabilirliği diğer direklerde güzel bir şekilde tarif edilmiştir.

Farklı bir notta, yerinde olsam senaryolarda ulaşmak istediğim hedefi de düşünürdüm. Her aracın kendine özgü yararları ve önemsizlikleri vardır. Dolayısıyla, Python'u büyük oranda kullanmama rağmen, her durumda bunu kullanmayacağım.

Birkaç senaryo düşünebilir ve onlar için faydalı olan bazı araçlardan bahsedebilirim.

FTP dosyaları-ve-fro; onları işlemek; e-posta bildirimleri gönder; ve bunun gibi

Bu durumda, kabukla (örneğin, Bash) yapışmak ve çeşitli yardımcı programları (örneğin ftp, cronve mail) kullanmak daha iyi olacaktır . Bu, birçok büyük şirkette tipik bir kullanım durumudur.

Hızlı metin işleme

Bir kez daha, kabuk. Programları gibi grep, awk, sed, pasteve diğerleri bu durumda çok kullanışlı.

İnşa etmek

C / C ++ etki alanında, bunun için evrensel bir araçtır make. Java dünyası Apache ANT'yi tercih ediyor.

Dağıtım ve uzaktan kumanda

Ya kabuk ya da Python. Örneğin, scpve rsyncsırasıyla dosyaları dosya (lar) kopyalarken veya senkronize oldukça faydalı olacaktır.

Python ise çok kullanışlı bir modül isminde fabric. Bu, örneğin dosyaları kopyalamak, bir işlemi durdurmak, sunucuyu yukarı ve aynı şekilde yapmak için daha karmaşık işlemler için faydalı olacaktır. Ayrıca, Python ayrıca pip, ilgili paketleri indirip yükleyerek belirtilen bağımlılıkları çözebilecek bir modül de sağlar .

(Yukarıdaki önerilerin kabuk özelliklerine çok fazla odaklanmadığına, aksine mevcut farklı hizmetlere odaklandığına dikkat edin .)


-1

Perl FreeBSD, NetBSD veya DragonflyBSD bazında değil, üzgünüm. OpenBSD'nin temel kurulumunda Perl var. OS X günümüzde sertifikalı bir UNIX'dir ve bazı seviyelerde bir çeşit BSD değişkeni olarak düşünülebilir ve temelde Perl, Python ve Ruby vardır.

Pek çok tescilli UNIXen'ın üslerinde Perl yoktur, örneğin Solaris, AFAIK ya HP-UX ya da IBM AIX ...


Solaris eksik Perl hakkındaki ifadeniz yanlıştır. Perl, Solaris'in zorunlu bir bileşenidir, en azından 2005'ten beri (Solaris 10).
jlliagre,
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.