Kabuk betiğinin yorumlanmış programlama dillerine göre avantajı nedir? [kapalı]


15

(Bunun uygun bir soru olup olmadığından emin değilim)

Kabuk betikleri, yazılanlar gibi bashbirçok şey yapabilir. Unix programlarını çağırabilir, çıktılarını birbirine bağlayabilir, G / Ç'yi dosyalardan / dosyalara yönlendirebilir, akışı kontrol edebilir, bir dosyanın var olup olmadığını kontrol edebilirler.

Ancak, modern bir programlama dili, örneğin, pythonve rubybunları da yapabilir. Ve (bence) daha okunaklı ve bakımı daha kolaydır.

bashgeniş yayılma benimseme sahiptir. Ancak birçok dağıtım da pythontercüman kurmuştur.

Peki bir senaryoyu kabuklamanın avantajı nedir? Eğer yazabilirsem python, rubyya da perlöğrenmeye değer bashmi?


3
Unix sistemleriyle çok çalışıyorsanız, diğer popüler Unix mermilerinin yanı sıra bash'ı da öğrenmelisiniz.
Bernard

Yanıtlar:


30

Kabuklar, dosyalarla çalışmak ve bir programdan diğerine veri almak için özel özelliklere sahiptir (verilerin metin olduğu varsayılarak). Bu görevler için, kabuk betikleri Python gibi bir betik dilinden daha az hantal olabilir.

Kabuk komut dosyası oluşturmanın avantajı, kullandığınız komutların temel olarak komut satırından kullanacağınız komutların aynı olması avantajına da sahiptir;

Örneğin, tüm PNG dosyalarını geçerli dizinden belirli bir dizine taşıyan bir bash betiği.

#!/usr/bin/sh
mv *.png $1

İşte bir Python sürümü.

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

Fark edeceksiniz:

  • Bash betiği, satırları sayarsanız (shebang satırı hariç) Python kadar üçüncü - karakter sayısına göre daha az
  • Python betiğinin içe aktarılması için üç kitaplık gerekirken, bu görev için ihtiyacınız olan her şey bash dilinde yerel olarak kullanılabilir
  • Python betiği dosyaları taşımak için açık bir döngü gerektirirken, bu da bash'daki mvkomutun anlamının bir parçasıdır.
  • Bash betiği daha hızlı çalışabilir - muhtemelen bash'tan çağırırsınız ve sourcekabuğun aynı örneğinde çalıştırmak için kullanabilirsiniz
  • glob.iglob("./*.png") sadece söylemek için oldukça ağız dolusu *.png

Python'da temel bir boru işlemi yazmak isterseniz, ayrıntıda şaşıracaksınız. (Elbette, boru geçişi gibi bazı şeyler, grepharici bir program kullanmak yerine Python kodu ile değiştirilebilir, bu nedenle genellikle o kadar fazla boruya ihtiyacınız yoktur.)

Karşı örnek olarak, bir keresinde dosya adlarının her birinin belirli bir dizinde ne kadar sürdüğünü kontrol eden bir rutin yazmak zorunda kaldım. Belirli bir işletim sistemi tarafından desteklenenden daha uzun olsaydı, kısalmaları gerekiyordu. Bu, düzeltmem gereken yinelenen dosya adlarına neden olabilir ve bir Web sayfasından bağlanacaklarından, kısaltılmış adların sabit olması gerekiyordu, yani, aynı uzun dosya adının her zaman sonuçlanacak şekilde üretilmesi gerekir. aynı kısaltılmış dosya adı. Bunu uzun dosya adının onaltılık bir md5'ini oluşturarak ve bunun ilk dört karakterini kısaltılmış isme ekleyerek yaptım (isimler hala çarpışabilirdi, ama çok tuhaftı, bu yüzden sadece bu durumu kontrol ettim ve olması gerekiyorsa kurtardı) .

Bunu bash'de yaptım çünkü zaten bash ile yazılmış olan yapı sistemimizin bir parçasıydı. Muhtemelen düşündüğünüz kadar doğru olmak tam olarak zordu. Python'a yazmak çok daha az zaman alacaktı ve muhtemelen daha net olurdu.

Kısacası: Farklı görevler için farklı diller tasarlanır; elinizdeki göreve en uygun dili seçin.


Aynı şeyi perl # / usr / bin / perl'de mv *.png $1yapamazsınız (yorumlar biçimlendirmeyi korumaz) ancak perl ile daha üst düzey dil özelliklerini de kullanabilirsiniz.
Poma

19

Mevcut cevaplar da geçerlidir, ancak henüz kimsenin bahsetmemesinin bir nedeni vardır: çünkü orada olacaktır.

Herhangi bir * nix kurulumu, yüklenebilecek veya yüklenmeyecek bazı isteğe bağlı paketlerle yapılır ve tüm sistemlerde Python veya Perl veya Ruby bulunmaz. Ancak, sistemin herhangi bir etkileşimli özelliğe sahip olması bekleniyorsa, bir kabuğu olacaktır. Bu, kabuk komut dosyalarının sunuculardan programcı masaüstlerine, sekreterlik ince istemci masaüstlerine, gömülü aygıtlara, yazılabilir dosya sistemini ve bash komut satırını destekleyen herhangi bir sistemde çalışacağı anlamına gelir.

Yalnızca tutarlı bir sunucu ortamında çalışan biri için bu, verilebilecek bir şeydir ve o kadar da önemli değildir. Daha çeşitli bir ortamda çalışan biri için bu göz ardı edilmemelidir.


9

Sorunuzun önemli bir kısmı burada yanıtlanıyor:

Komut dosyası dilleri (ör. Perl, Python, Ruby) neden kabuk dili olarak uygun değil?

İşte bu soruya verdiğim yanıttan bir alıntı :

Aklıma gelen birkaç fark var; sadece burada düşünerek, belirli bir sırayla:

  1. Python & Co. komut dosyalarında iyi olacak şekilde tasarlanmıştır. Bash & Co., kesinlikle hiçbir ödün vermeden sadece komut dosyalamasında iyi olacak şekilde tasarlanmıştır . IOW: Python hem kodlamada hem de kodlamada iyi olacak şekilde tasarlanmıştır, Bash sadece kodlama ile ilgilenir.

  2. Bash & Co. türsüzdür, Python & Co. güçlü bir şekilde yazılmıştır, bu da sayı 123, dize 123ve dosyanın 123oldukça farklı olduğu anlamına gelir . Bununla birlikte, statik olarak yazılmamışlardır, bu da onları ayırmak için bunlar için farklı değişmezlere sahip olmaları gerektiği anlamına gelir. Misal:

    • Ruby: 123(sayı), Bash:123
    • Ruby: '123'(dize), Bash:123
    • Ruby: /123/(normal ifade), Bash:123
    • Ruby: File.open('123')(dosya), Bash:123
    • Ruby: IO.open('123')(dosya tanıtıcı), Bash:123
    • Ruby: URI.parse('123')(URI), Bash:123
    • Ruby: `123`(komut), Bash:123
  3. Python & Co ölçek için tasarlanmıştır kadar hatta belki 1000000 hat programları Bash & Co ölçek için tasarlanmıştır, 10000, 100000 için aşağı 10 karakter programlarında.

  4. Bash & Co.'da dosyalar, dizinler, dosya tanımlayıcıları, süreçlerin tümü birinci sınıf nesnelerdir, Python'da yalnızca Python nesneleri birinci sınıftır, dosyaları, dizinleri vb. Değiştirmek istiyorsanız bunları bir Önce Python nesnesi.

  5. Kabuk programlama temel olarak veri akışı programlamadır. Hiç kimse bunun farkında değil, mermi yazan insanlar bile değil, mermilerin bu konuda oldukça iyi olduğu ve genel amaçlı dillerin çok fazla olmadığı anlaşılıyor. Genel amaçlı programlama dünyasında, veri akışı genellikle bir programlama paradigması kadar değil, bir eşzamanlılık modeli olarak görülmektedir.

Özellikleri veya DSL'leri genel amaçlı bir programlama diline bağlayarak bu noktaları ele almaya çalışmanın işe yaramadığını hissediyorum. En azından ikna edici bir uygulama görmedim. Ruby'de bir kabuk uygulamaya çalışan RuSH (Ruby kabuğu) var, Ruby'de kabuk programlama için dahili bir DSL olan acele var, bir Python kabuğu olan Hotwire var, ama IMO bunların hiçbiri bile yaklaşmıyor Bash, Zsh, balık ve arkadaşlarla yarışmaya.


Bozuk Bağlantı: Şu anda bahsettiğiniz bu soru (ve cevap) nerede? Yoksa faydalı olan her şey buraya mı kopyalandı?
Wolf

1
@Wolf: Görünüşe göre, neredeyse üç yıl sonra konu dışı olduğu için silindi. Bu talihsizlik.
Jörg W Mittag

1
İşte bu sorunun arşivlenmiş bir versiyonu: web.archive.org/web/20140528035940/http://stackoverflow.com/…
waldyrious

1

Bir kabuk betiğinin sadece süper basit bir otomatik görevi kırmak istediğiniz durumlarda avantajı olduğunu söyleyebilirim. Örneğin, bir dizini bir sunucudan diğerine her gün 5: 00'da yedekleyen bir komut dosyası yazmak isterseniz, ağır hizmet programlama dili kullanmak aşırı derecede ağır olacaktır.

Öte yandan, programlama görevinizin kontrol yapılarına (eğer / sonra / else), yinelemeli yapılara (döngü), veritabanı ve dosya G / Ç, vb. Daha fazla ihtiyacı varsa, muhtemelen daha yetenekli olanlar için daha uygundur kabuk dili yerine programlama dili.

İyi bir kural olduğunu düşünüyorum:

automatingSimpleTask ? shellScript() : programmingLanguage();

2
shellScript() if automatingSimpleTask else programmingLanguage() Lol olmamalı .
17'de gahooa

1
@gahooa haha ​​çitin hangi tarafında olduğumu gösterir!
CFL_Jeff

1

Bir python / ruby ​​/ herhangi bir programdan program başlatabilirsiniz, ancak kabukta farklıdır. Örneğin bir şey başlatmak için bir API kullanmanız gerekebilir - fork (). Kabuk betiğinde, programlar geleneksel bir programlama dilinde daha çok işlev görür ve en az çabayla yürütülebilir, aktarılabilir, vb. Veri akışı da borular kullanılarak çok net.


0

Belirli görevler için kullandığınız programlama dilini seçmekte tamamen özgürseniz, muhtemelen bash öğrenmeyi neredeyse tamamen önleyebilir ve Perl, Python veya Ruby ile her komut dosyası programlama görevini yapabilirsiniz. Bu bazen daha ayrıntılı bir çözüme yol açabilir, özellikle de diğer Unix araçlarının bir dizisini çağıran bir betiğe ihtiyacınız olduğunda, ancak daha karmaşık durumlarda haklısınız, bu modern kod dilleri size daha iyi korunabilir kod yazmak için daha fazla olanak sağlar (onlar da gizlenmiş kod yazmak için daha fazla olasılık verir, ama bu senin seçimin).

Öte yandan, çoğu zaman en çok sevdiğimiz dili seçmekte özgür değiliz, çünkü bash bilen ancak adlandırdığınız komut dosyası dillerinden birini bilmeyen eski kod veya kodla çalışmak zorundayız.


0

Kabuk komut dosyası olan bir yorumlanır programlama dili. Perl veya python veya başka bir komut dosyası dili yerine bash dilinde komut dosyası yazmayı seçmem için birkaç neden var:

Her yerde çalışır : Sistemin başlatılması veya gömülü sistemler gibi daha karmaşık tercümanlar her zaman bulunmayabilir. Bash, meşgul kutusunda bile kullanılabilir.

Komut satırında çalışır : Kabuk komut dosyalarında deneyimli iseniz, bu komutları doğrudan komut satırında geçici komut dosyalarında karmaşık şeyler yapmak için kullanabilirsiniz. Bu beceriyi günlük olarak bir sistem yöneticisi olarak kullanıyorum.

Diğer programları çağıran programlar yazmak daha kolay: Yapmaya çalıştığınız şey, mevcut birkaç programı ilginç yollarla bir araya getirmekse, bir kabuk betiğinde daha üst düzey bir dilde yapmak daha kolay olabilir.

Program 30 satır veya daha azsa, genellikle kabuk komut dosyası kullanarak yazarım. Herhangi bir karmaşık manipülasyon veya karmaşık veya analiz ile uğraşmak varsa, bunu python veya perl kullanarak yapacağım.


-1

Kahveye bir göz atmalısınız. Onların sözleri:

Tüm bu garip parantezlerin ve noktalı virgüllerin altında JavaScript'in kalbinde her zaman muhteşem bir nesne modeli vardı. CoffeeScript, JavaScript'in iyi kısımlarını basit bir şekilde ortaya çıkarma girişimidir.

CoffeeScript'in altın kuralı: "Bu sadece JavaScript".

...Ey ... iţte süper acemi cevap geliyor.

Son 6 aydır otomatik öğrenen bir başlangıç ​​olarak ve son günlerde biraz C, C ++, Javascript ve daha fazla Bashscript tadı ... Size söyleyebilirim:

Kabuk betikleri, bash ile yazılmışlar gibi, birçok şey yapabilir. Unix programlarını çağırabilir, çıktılarını birbirine bağlayabilir, G / Ç'yi dosyalardan / dosyalara yönlendirebilir, akışı kontrol edebilir, bir dosyanın var olup olmadığını kontrol edebilirler.

ve bu basit fantastik değil ! ? döngüler ve değişkenler? Vaov!

python ve ruby, bunları da yapabilir. Ve (bence) daha okunaklı ve bakımı daha kolaydır.

Lütfen, bunu nerede gördüğünü söyle? Ben de bashscript yazdı gedit bile Geany ve ben biçimlendirebilir, (sekmeler?) Ve diğer dillerde comparision hafif kullanılarak bashscript hızındaki kodumu okuyun.

Bu dillerin düzeni sağlamak için başka araçları var mı? Nesneye yönelik kod bir sürü kaydetmek biliyorum, ama ... insanlar bashscript de OO olduğunu söylüyor! WOW 2! Burada benim amacım bu. Gidiyor:

bir script kabuk avantajı

bu sorunun içinde: Bu bashdamnthing perl veya phyton veya ruby ne yapabilirim? Bu kolay?

( bashdamnthing = xdotool )


WTF burada mı oluyor? Doge cevabı gibi ..
naught101
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.