Bash kabuk komut dosyalarına komut dosyası alternatifleri


17

Bir UNIX iş istasyonuna yeni taşındım. Bash kabuk komut dosyalarının anılarım okuldan beri kayboldu ve sözdiziminin oldukça kafa karıştırıcı olduğunu düşünüyorum. Görevleri otomatikleştirmek için diğer komut dosyası dillerinin ne olduğunu merak ediyorum. Duyduğum en popüler iki kişi Perl ve Python.

  1. Hangi betik dili gerçek dünyadaki dükkanlar tarafından en yaygın olarak kullanılır?
  2. Hangi kodlama dili C / C ++ sözdizimine en çok benziyor?
  3. Farkında olmadığım başka bir komut dosyası dili var mı?

Yardımın için teşekkürler,

Scott


2
Bu muhtemelen bir topluluk wiki'si olmalıdır.
EBGreen

2
Aslında çoğu sistem görevleri için şimdi PHP kullanıyorum. Yakında buna uygun bir cevap vereceğim. Yerleşik çok sayıda kütüphane var, bu kullanışlı.
Kyle Hodgson

Kabuk amaçlı diller diğer dillerin yapamayacağı bir şey yapar; Hangi yönetmek ve kontrol altında tutmak tüm çocuk süreçleri yinelenen hiç yumurtladı. Blog reklamı Phusion Passenger neden ayrıntılı olarak açıklıyor: phusion.github.io/baseimage-docker Kısacası, lang-x ile yazılmış komut dosyalarınız muhtemelen kapatma yordamlarını düzgün işlemiyor . Bu, gerçek bir kabuk sürecinin çocukları olarak çalıştırdığınız sürece mükemmel olur. Feragat, ben uzman değilim. Bu bilgi sadece kusurlu olabilecek anlayışımın en iyisidir.
ThorSummoner

Yanıtlar:


12

Bir dereceye kadar kişisel tercih meselesi. Popülerlik açısından Perl ve Python kesinlikle orada.

Ancak üç sorunuzdan ikisini yanıtlamak için:

  1. Sanırım bash en yaygın şekilde kullanılıyor, muhtemelen perl geliyor. Sadece tahmin, kimse anket yaptıysanız bilmiyorum. :)
  2. Orada bazilyonlarca senaryo dili var. :)

Benim tavsiyem Python olsa. Okuması ve yazması kolaydır, son derece güçlüdür ve web'de, öğrenebileceğiniz ve kopyalayabileceğiniz ve yeniden amaçlayabileceğiniz koddan bahsetmemek için tonlarca yararlı kaynak vardır.


1
İkinci olarak. REXX ile eski OS / 2 gün içinde olduğu gibi Python öğrenmesi kolay ve attığım her şeyi yapabiliyorum.
slovon

3
Python için +1 ... bir betik dilinde C'nin gücü. Senaryolarınızı istediğiniz kadar basit veya karmaşık yapabilirsiniz;)
KFro

2
NT olmayan sistemlerde python modülü sh, kabuk kodlama dili olarak python kullanımını erişilebilir kılar; Ancak, uç durumlarda (çoklu işlem gibi) karşılaşırsanız, bu güne kadar kullanmak için çok zor bulduğum alt işlem modülünü öğrenmeniz gerekir.
ThorSummoner

5

Perl ve Python açıkça cevaplar; ancak her biri farklı görevleri tamamlamak için kullanılır:

  1. Bash - Öğrenmesi en kolay eller aşağı. Bash komut dosyalarıyla komutları çalıştırır ve çıktıyı yönetirsiniz.
  2. Python - Öğrenmesi en kolay ikinci. Python, tam programlar yazmak için Python'u kullanabileceğiniz ve topluluk tarafından iyi desteklendiği için Bash'ten çok daha kullanışlıdır. Python aylar sonra son derece okunabilir ve kolayca düzenlenebilir.
  3. Perl - Üçünün en iyisi (betik için), ancak kolayca en dik öğrenme eğrisi. Çok iyi düzenli ifade desteği var (bugün hala kullanılmasının ana nedeni budur) ve muhtemelen zaman içinde birçok Perl betiği ile karşılaşacaksınız. Perl ile ilgili temel problemler kod okunabilirliğidir - kod yazdıktan aylar sonra ne yaptığını anlayamazsınız. Yani ağır yorum yapsan iyi edersin.
  4. Awk / Sed - Her ikisi de çok faydalı, ama her ikisi de öğrenmesi çok zor. Kalıplarda iyi olmadıkça, bunlarla mücadele etmenizi öneririm.

Şu anda hangisini öğreneceğime gelince (muhtemelen hiçbirini bilmediğinizden beri), Python'u öğrenirim. Bilmesi en basit ve en faydalı olanıdır.

Ve sorularınızın cevaplarına gelince:

Hangi betik dili gerçek dünyadaki dükkanlar tarafından en yaygın olarak kullanılır?

Hepsi, ama Perl'in burada biraz avantajı olduğunu düşünürüm (sistem yönetiminde çok daha uzun süredir kullanılmaktadır).

Hangi kodlama dili C / C ++ sözdizimine en çok benziyor?

Perl

Farkında olmadığım başka bir komut dosyası dili var mı?

Ruby, Tcsh / Csh, http://en.wikipedia.org/wiki/Iterpreted_language


2
Perl'e biraz zaman koyarsanız, mükemmel okunabilir perl yazabilirsiniz. Spagetti kodu yazan insanlar başarısızlıklarından dolayı Perl'i suçlamak için çok hızlıdır.
Cian

1
Sadece bir sistem yöneticisi olarak deneyimlere dayanarak konuşuyorum; Okumak imkansız olan diğer insanların yazdığı kodları korumak zorunda kaldım. Genellikle sonunda sadece Python kodunu yeniden yazıyorum.
Michael Pobega

3

küçük işler için awk, onelin üstünde olanlar için python.

Python (belirli API'leri ve platforma bağlı diğer şeyleri kullanmıyorsanız), python sürümünü kullanımda olduğunuz tüm platformlarda bulunan zengin bir "standart kitaplığa" sahiptir. Komut dosyalarınızı kolayca tekrar kullanabileceğiniz için bu çok güzel ve platformunuzu değiştirseniz bile bilginizin iyi bir yatırım olduğu anlamına geliyor.

Şirketimizde uygulama için tüm kodlama, izleme, ... ve java için python kullanıyoruz ve heterojen ortamda iyi durumdayız.


2

Sh (bourne kabuğu), grep, awk ve sed her zaman tekrar kavramak için iyi bir şeydir. Çok fazla metin regexing istemiyorsanız Perl mükemmel ve sürdürülebilirlik o kadar da önemli değil (mümkün olmadığını söyleyerek). Python; okunabilirlik sizin için önemliyse. Benim tercihim Python ama tüm bu araçlar ona attığın çoğu şey için iyi. Siz c / c ++ sözdizimi gereksinimini yeniden gözden geçirmek isteyebilirsiniz, takılı kalmak uzun vadede size yardımcı olmaz.


Teşekkürler Martin. Ben fark ettim (web üzerindeki örneklerden), Perl PHP için dikkate değer bir benzerlik taşır (Her ne kadar eminim PHP önce Perl olduğundan eminim). Bu adil bir ifade mi?
Scott Davies

PHP 1.0 bir perl betiğiydi, bu yüzden tesadüf değil :)
Bill Weiss


1

Perl ve python'un muhtemelen en iyi iki alternatif olduğunu söyleyebilirim. Sed ve awk ile de çok şey yapabilirsiniz.


1

Bir şeyi sıfırdan öğrenmek istiyorsanız, muhtemelen bash'ı (yeniden) öğrenmek en iyisidir.

Bunun ötesinde, perl ve python günümüzde popülerdir; Perl'e kısmi davranıyorum, ancak Perl komut dosyası stilim Perl 4 çıktığı için pek değişmedi.

Herhangi bir "c-sözdizimi benzeri" komut dosyası dilinin farkında değilim.


1

Perl, sadece CPAN'ın inanılmaz kaynağı için ( http://search.cpan.org/ ) eller aşağı . Böylesine muazzam katkıda bulunan bir toplulukla bir betik dili kullanmanın yararı, bir şeyi kendiniz icat etmeye ihtiyaç duymamanızdır.

Perl ayrıca mevcut durum için ihtiyaç duyduğunuz kadar karmaşık olma avantajına sahiptir. Hızlı yönetim veya tek amaçlı komut dosyaları için basit bir komut dosyası dili olarak kullanabilirsiniz, ancak daha büyük, bakımı kolay uygulamalar (cinler, sunucular, istemciler gibi) oluşturmak istediğinizde nesneye yönelik kavramları veya kapsamlı meta nesne sistemlerini kullanabilirsiniz.

Sadece kodlama dilleri arasındaki farklar açık bir kazanan seçecek kadar ciddi değildir, ancak öncelikle önem verdiğiniz konular hakkında bilgi bulmanın ne kadar kolay olduğuna bakmalısınız.

Perl sözdizimi, yazım ve işaretlerin eksikliğini giderebildiğiniz sürece, C'ye çarpıcı bir şekilde yakın olabilir; Gelişmiş perl kullanımı, sonunda dilin güçlü yönlerini öğrendiğinizde doğal olarak gelir.

Okunabilirlik cephesindeki kullanıcılar için: herhangi bir dilde okunması zor bir kod yazabilirsiniz. Kodunuza 4 ay öncesinden bakarsanız ve anlayamazsanız, yanlış bir şey yapıyorsunuz demektir.

ps Bu yazı, CPAN'daki çeşitli yönetim dostu modüllere bağlantılar ile doluydu, ancak görünüşe göre yeni kullanıcılar sadece bir bağlantı gönderebilir, bu nedenle 'CPS' 'SVN' 'Cron' ve 'Moose' (bir kapsamlı nesne sistemi)


1
  1. en çok kullanılan: Perl, çoğunlukla tarihsel nedenlerden dolayı. Python tüm Linux ve BSD dağıtımlarında yaygın olarak bulunur (Mac OSX'te bile yüklüdür) ve öğrenmesi / programlaması çok daha hoştur. Elbette, sözdizimini aldıktan sonra, Bash komut satırında yapabileceğiniz hemen hemen her şey için daha basittir. Sonuçta, bir komut satırı.

    • C sözdizimi: csh var , ancak TCC'yi kolayca yükleyebilir ve gerçek C'yi kodlama dili olarak, kaynaktan diğer diller başlangıcından daha kısa sürede derleyebilirsiniz.

    • diğer betik dilleri: çok! Lua , Ruby , JavaScript ...


1

Uygun olanların hepsini bir arada kullanmalısınız. Perl'den (okunabilirlik) gerçekten hoşlanmıyorum, ancak birçok şey için iyi. Öte yandan Python, birkaç KVM makinesini yönetmek zorunda kalmadan (ve hala yapmak zorunda kalana kadar) sistem yönetimi açısından benim için yeni bir şeydi. Tüm bu makineleri komut dosyasıyla başlatmak, durdurmak, kaydetmek, yüklemek, taşımak, libvirt'in python bağlamaları ile uğraştıktan 1 saat sonra gerçek oldu.

Son olarak, her gece bir mysql sunucusundan tüm veritabanlarını (kendi döküm dosyasındaki her veritabanını) dökmek zorunda kalırsak, perl veya python kullanmaz, onları tar ve başka bir sunucuya rsync. Neden ? Çünkü bash yazmak daha hızlı ve daha kolay :)

Sonunda, mevcut görevinize en uygun dili kullanmalı ve yalnızca en çok sevdiğiniz için belirli bir komut dosyası dilini kullanmamalısınız.


1

[genel komut dosyası önerileri için diğer yanıtlara bakın]

Bu cevap, komut satırı programlarının kullanımı ve bunların büyük zincirleriyle ilgilidir.

CLI programlarının zincirlerini ve belki de sırayla birçok zinciri çalıştırmak için bash en kolayıdır. Perl de aynısını yapabilir, ancak dili öğrenmek çok daha zordur ve çok daha karmaşıktır ve birçoğunun belirttiği gibi anlaşılabilir Perl yazmak kolaydır.

Dosya ve parametreler üzerinde yineleme yapıyorsanız, bash en iyi yöntemdir b / c kabukta prototip yapabilir, daha sonra bir komut dosyasına kopyalayabilir ve minimum ek yük ile bazı diziler ve döngüler ekleyebilirsiniz.

Ne demek istediğimin örnekleri:

$ cat input.dat | numerical_model source_data ${SRC} grid_size ${GRID_SIZE} param1 ${P1} param2 ${P2} | tee ${OUTPUT} | plotter title ${TITLE} ylabel ${YLABEL} xlabel ${XLABEL} > ${OUTPUT_FIG}
$ cat ${OUTPUT} | stats_cmd bin_size ${BINSIZE} dist_type ${DIST_TYPE} | tee ${OUTPUT_STATS} | plotter plot_type ${PLOT_TYPE} title ${TITLE_STATS} > ${OUTPUT_FIG_STATS}

Bash'da, bu parametrelerin bazılarına birkaç döngü halinde sarmak kolaydır . Ancak , komut dosyası birkaç on satırdan fazla olduğunda kodu okumak zorlaşır. --- 30 farklı veri grafiği için 30 komut seti (her biri birkaç satır) düşünün ---

Perl ve Python, büyük komut dosyaları için daha iyi olabilir, çünkü döngü ve değişkenler için daha temiz bir sözdizimine sahiptir, ancak bash komutları dize olarak oluşturulmalı, alt işlemler olarak çalıştırılmalı ve stdin, stdout yakalanmalıdır. Bu yapılabilir, ancak yerel kabuk ortamının tamamen yerini alamaz.

Eğer mermilerin daha iyi bir dili olsaydı, bundan kaçınılabilirdi.


0

Ruby'yi seviyorum. Programlaması basit ve kolaydır. Ruby kullanarak sistem yönetimi hakkında mükemmel bir kitap var .

Ruby çeşitli konfigürasyon yönetim sistemlerinde (capistrano, şef, kukla) ve metasploit'in son versiyonunda kullanılır.

Sen kullanabilirsiniz acele , yakut sözdizimi ile Unix kabuk yerine birini ve bu gibi şeyler yapmak:

local = Rush::Box.new('localhost') 
remote = Rush::Box.new('my.remote.server.com')     
local_dir = local['/Users/adam/myproj/']
remote_dir = remote['/home/myproj/app/']

local_dir.copy_to remote_dir
remote_dir['**/.svn/'].each { |d| d.destroy }

Teşekkürler chmeee. Ruby'yi sysadmin için kullanabileceğiniz hakkında hiçbir fikrim yoktu - her zaman web merkezli olduğunu düşündüm. Çoğu kuruluşta kullanılan bir şey arıyorum. Sysadmin için Ruby'nin hala çok kanama olduğunu söylemek doğru mu?
Scott Davies

1
Shell / Perl her yerde güvenilir bir şekilde bulabileceğiniz iki dildir. Python muhtemelen bir sonraki en yaygın olanıdır, yakut çok uzak bir dördüncü çalışır (aslında, muhtemelen beşinci, awk'ın arkasında).
Cian

@ScottDavies PHP ve ASP.net bildiğim tek web merkezli dillerdir; sadece web üzerinde çalışacak şekilde tasarlanmış Javascript bile form doğrulaması için bir öncü olmuştur. Ancak, görünüşe göre bash bile, herhangi bir dilde html gönderebilirsiniz .
ThorSummoner

0

Ruby tek gömlekli örnek:

> echo 'Shell is the best!' | ruby -pe 'gsub("Shell", "Ruby")' 

Ruby is the best!

> printf "foo\nbar\nbaz\n" |  ruby -ne 'BEGIN { i = 1 }; puts "#{i} #{$_}"; i += 1'

1 foo
2 bar
3 baz

Ruby kullanırdım.

Sh ile karşılaştırın, modern ve güçlü.

Python ile karşılaştırın, tutarlılık, bir baskı, bir paket yöneticisidir. Ve girinti sözdizimini sevmiyorum.

Perl ile karşılaştırıldığında, biraz eski okul ve sözdizimi benim için çok karmaşık.

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.