Python'a kıyasla Shell Scripting'in güçlü yönleri [kapalı]


95

Birkaç kez kabuk (bash) komut dosyası öğrenmeye çalıştım, ancak sözdizimi tarafından uzaklaştırıldım. Sonra Python'u buldum ve bir kabuk betiğinin Python'da yapabileceği şeylerin çoğunu yapabildim. Artık zamanımı kabuk komut dosyası yazmayı öğrenmeye yatırmam gerekip gerekmediğinden emin değilim. Bu yüzden sormak istiyorum:

Python'a kıyasla onu vazgeçilmez bir araç yapan kabuk komut dosyası yazmanın güçlü yönleri nelerdir?

Mesleğe göre bir sistem yönetimi değilim, ancak ev kullanıcıları için Linux sistemleri kurmakla ilgileniyorum, bu nedenle kabuk komut dosyası öğrenmenin gerekli olabileceğini düşünüyorum.

Yanıtlar:


83
  • Kabuk komut dosyası, G / Ç yeniden yönlendirmesi için daha basit gösterimlere sahiptir.
  • Kabuktaki mevcut programlardan boru hatları oluşturmak daha kolaydır.
  • Kabuk komut dosyası, tüm programları yeniden kullanır.
  • Shell evrensel olarak mevcuttur (Unix gibi herhangi bir şeyde) - Python'un kurulu olması gerekmez.

Shell'de yapabileceğiniz her şeyi Python'da yapabileceğiniz doğrudur; Python'da kolay olan kabukta zor olan şeyler olduğu da doğrudur (tıpkı kabukta kolay ancak Python'da zor olan şeyler olduğu gibi). Her ikisini de bilmek uzun vadede en iyisi olacaktır.


17
1 ve 2, iyi puan. # 3 bir zayıflıktır, çünkü Python'un önleyebileceği çok fazla ek yüke yol açar. # 4 büyük ölçüde yanlış olabilir. Python artık çoğu Linux dağıtımının bir parçası.
S.Lott

1
@Svante: "test" ve "ifade" gibi komutları kullanarak bir dizi işlemi gerçekleştirmek için basit bir kabuk döngüsü yazın ve çalışma sürelerini "os" modülünü kullanan bir Python betiği ile karşılaştırın. Test ve ifade gibi komutlar genellikle gerçek işi yapmak için bir alt süreci çatallamayı içerir.
S.Lott

2
3. noktayı dezavantaj olarak değil, büyük bir avantaj olarak görüyorum. Örneğin, dönüştürme programıyla görüntülerle dolu bir dizini yeniden boyutlandırmayı düşünün.
Glenn

7
Ayrıca # 4 ile ilgili olarak kayda değer bir nokta, bashkabuğun özellikle tüm linux dağıtımlarında evrensel olarak mevcut olmamasıdır, özellikle gömülü sistemler için ve çalıştırılabilir busyboxdosyayı çalıştıran diğerlerinde . bashGeriye dönük olarak uyumlu olan Bourne kabuğunun kendisini hedefleyen betikler , tüm POSIX uyumlu sistemlerde çalışacaktır, ancak bu dil, uygulanandan çok daha kısıtlıdır bash.
intuited

5
@intuited: eval "$ (geçmiş 2 | kafa -1 | perl -pe 's / (? <= hangisi) daha büyük olasılıkla / en azından /')"; tarihi $ -d (| kafa -1 | geçmişi 2 sed 's / ^ \ s * ([0-9] \ +) / \ 1 /)
intuited

54

"Kabuk komut dosyası yazmanın Python'a kıyasla onu vazgeçilmez bir araç haline getiren güçlü yönleri nelerdir?"

Kabuk vazgeçilmez değildir. Neden bu kadar çok olduğunu düşünüyorsun? bash, tcsh, csh, sh, vb.,

Python olan bir kabuk. Tüm komutları çalıştırmak için kullanacağınız değil, komut dosyası oluşturmak için idealdir.

Python, tüm Linux dağıtımlarının aşağı yukarı standart bir parçasıdır.

Daha geleneksel mermiler çok fazla şey yapar.

  1. Komutları çalıştırmak için kullanışlı bir kullanıcı arayüzüne sahiptirler. Bu, kabuğun PATH'inizi aradığı, çatalladığı ve istenen programı çalıştırdığı tek satırlık komutları içerir. Ayrıca boru hatları, dizileri ve eşzamanlı programları (kullanılmasını içerir ;, |ve &) yanı sıra bazı yeniden yönlendirme (kullanarak >ve <).

  2. Betikleri çalıştırmak için küçük bir programlama dili benzeri yetenekleri var. Bu dili kullanmak oldukça zordur ve son derece verimsizdir. Bu dildeki çoğu ifade, bir veya daha fazla ek işlemin çatallanmasını, zaman ve hafızanın boşa harcanmasını gerektirir.

Programları kabuktan çalıştırmak, stderr'i bir günlük dosyasına yönlendirmek ve bu tür şeyler iyidir. Bunu kabukta yapın.

Hemen hemen her şey bir Python betiği olarak daha verimli ve daha net bir şekilde yapılabilir.

İkisine de ihtiyacınız var . Ancak, geleneksel bir kabuk dilinde if-ifadeleri veya döngüler içeren bir komut dosyası asla yazmamalısınız.


1
@ sezgisel. A) Farklı kabukların çoğalması, "kabuk" olarak birleşen özelliklerin sayısını kanıtlar; önemli bir rol değil, ancak özellikler için her şeyi kapsıyor. B) Python yorumlayıcısı uygun bir unix kabuğudur, #! Kullanır. C) "Basit" bir kabuk ififadesi genellikle testprogramı çalıştırmayı içerir . Kabuk, her bakımdan berbat bir programlama dilidir.
S.Lott

4
@S. Lott: Görünüşe göre buradaki devrede bazı anlamsal uyumsuzluklar var. Benim bir UNIX kabuğu tanımım, dili öncelikle bir UNIX sisteminin çalışmasını yüksek düzeyde kontrol etmeye yönelik olan bir tercüman olacaktır. Bu tanıma göre, bir tür kabuk kesinlikle bir UNIX sisteminin çalışması için gereklidir ve Python buna uygun değildir. Bu terimi nasıl tanımlarsın?
intuited

1
@ S.Lott: Geleneksel kabuk komut dosyasında kullanılan sözdiziminin büyük bir hayranı değilim, ancak ana amacın süreçleri ve çıktılarının akışını kontrol etmek olduğu birçok durumda oldukça kullanışlı ve uygun buluyorum. Bu genellikle karar vermeyi ve yinelemeyi gerektirir. Modern kabuklar ( bashen azından) karar vermeyi idare etmek için yerleşiklere sahiptir (örneğin test, bashdaha çok yönlü yapılara ek olarak bir yerleşiktir). Zayıf yönleri olduğu kadar güçlü yönleri de var. Diğer dil türlerinden çok farklı bir paradigmaya sahip olduğu için ayrıntılı olarak öğrenmeye de değer.
intuited

1
@intuited: "oldukça kullanışlı bul" beceriniz için bir selam, berbat bir dil değil. Python, yetenekli olmayan kişiler tarafından daha kullanışlı olabilir.
S.Lott

3
@ S.Lott: İlginç, benden çok farklı bir felsefeniz var. Tasarım ve işlemlerin temelde tavuklar ve yumurtalar olduğunu düşünüyorum. Bu, bir kabuk betiğinin, programları çalıştıran bir program olduğunu söylemektir. Bu programların çoğu, başlangıçta giderek karmaşıklaşan kabuk komut dosyaları olarak uygulandı. Bir noktada, bazılarının C'de ve daha sonra Python'da yeniden yazılması, muhtemelen modülerlik kadar verimlilik uğruna da değerli hale geldi. Örneğin: bir noktada cat "$1" | ssh "$2" "cat - >\"$1\""doğdu scp. Onu en iyi nasıl tasarlayacaklarını biliyorlardı çünkü zaten kullanıyorlardı.
intuited

32

Kabuk, daha karmaşık şeyleri çok daha karmaşık hale getirme pahasına, ortak ve basit eylemleri gerçekten basitleştirir.

Tipik olarak, küçük bir kabuk betiği, karşılık gelen python programından daha kısa ve daha basit olacaktır, ancak python programı değişiklikleri zarif bir şekilde kabul etme eğiliminde olacaktır, oysa kabuk betiği kod eklendikçe daha az bakım yapılabilir hale gelecektir.

Bu, optimum günlük üretkenlik için kabuk komut dosyası oluşturmaya ihtiyaç duymanızın sonucudur, ancak bunu çoğunlukla atıl komut dosyaları için ve diğer her yerde python kullanmalısınız.


14

Python ile yapamayacağınız kabuk betikleri ile yapabileceğiniz hiçbir şey yoktur. Kabuk komut dosyalarının en büyük avantajı, kabuğu kullandığınızda kullandığınız komutların aynısını kullanmanızdır, bu nedenle yoğun bir kabuk kullanıcısıysanız, kabuk komut dosyası bir noktada kabuk çalışmanızı otomatikleştirmenin çok hızlı ve kolay bir yolu haline gelecektir. .

Ayrıca kabuk komut dosyalarındaki veri boruları ile uğraşmayı python'dan daha kolay buluyorum, ancak kesinlikle python'dan yapılabilir.

Ve son olarak, kabuk komut dosyalarını çalıştırmak için ek bir yorumlayıcı çalıştırmanıza gerek kalmaz, bu size çok küçük, ancak bazen fark edilir bir hız ve bellek kullanım avantajı sağlar.

Ama yine de, Python betikleri çok daha sürdürülebilir, bu nedenle büyük çirkin kabuk betiklerinden Python betiklerine geçmeye çalışıyorum. Python ile istisna işleme ve QA yapmak da daha kolaydır.


9

önceki yanıtların hepsinin de gösterdiği gibi, kabuk komut dosyasını öğrenmek zorunda değilsiniz; ama öğrenmek asla kötü bir şey değildir. bu gerçekten kişisel öncelikler meselesi. Bir başkasının size neyin zaman ayırmaya değer olup olmadığını söylemesi çok zordur.

çoğu programcı yeni dil öğrenmenin her seferinde giderek daha kolay hale geldiğini fark eder. (aynısı büyük ölçüde doğal diller için de geçerlidir) ve ne kadar erken başlarsanız o kadar iyidir.

artı: bir dili öğrenmiş olmak, tam bir bilgi ve aşinalık konumundan ötürü sınırlarını abartılı bir şekilde ortadan kaldırmanızı sağlar. bu muhtemelen seni sevişmeyecek, ama meslektaşlarından sana bir bira kazandırabilir!


8

Önceki cevapların çoğuna katılıyorum. Dosya sistemine yönelik görevleri yapmak için en uygun kabuk komutlarını düşünüyorum (dosyaları kopyala ve taşı, grep, vb.). Tek bir >>file.txtyönlendirme, örneğin ihtiyaç duymak yerine anında dosyaya eklediği için , bence, dosyaya okumak ve yazmak zorunda kalırsanız, Shell daha iyidir file=open('file.txt','a'); file.write().

Şu anda, kişisel kullanımım için, her ikisini de karıştırıyorum, bir python betiği oluşturuyorum ve os.system ('command') veya os.popen ('command') komutunu çağırıyorum.


6

Kabuk her yerde mevcuttur. Nispeten temel bir taşınabilir işlevsellik setine bağlı kalırsanız, komut dosyalarınız cep telefonlarında, kablosuz yönlendiricilerde, DVR'lerde, netbook'larda, iş istasyonlarında, büyük demir sunucularda ve benzerlerinde çalışabilir. Python, birçok sistemde kutunun dışında yer almayabilir ve ortama bağlı olarak onu kurmak zor olabilir.

Kabuk komut dosyası oluşturmayı öğrenmek, komut satırı da kabuk olduğu için bazı komut satırı hilelerini öğrenmenize de yardımcı olabilir. Oldukça uzun ve karmaşık bir komut satırı almak ve onu biraz daha ihtiyacınız olduğunu fark ettikten sonra daha genel bir betiğe dönüştürmek için de iyidir.

Kabuk ayrıca oldukça güçlü özelliklere sahiptir; boru hatları, bildiğim kadarıyla sadece kabuğa özgü olan gerçekten ilginç bir kontrol yapısıdır.


5

Python'un kabuk komut dosyalarını seçerken göz önünde bulundurulması gereken bir diğer husus, hedef makinelerde çalışacak olan Python sürümüdür. RHEL5 (bir isim vermek gerekirse) uzun bir süre buralarda olacak. RHEL5, Python 2.4 ile sıkışmış durumda. 2.4 sonrası Python'a eklenen işlevselliğe bağlı birçok güzel kitaplık var.

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.