Kapan menggunakan Bash dan kapan menggunakan Perl / Python / Ruby? [Tutup]


78

Kami sedang melakukan semua skrip kami dengan Bash sejauh ini, tetapi saya mulai merasa agak konyol tentang hal itu. Meskipun kita tentu saja dapat melakukan semua yang kita inginkan dengan Bash (ini cukup kuat), saya mulai bertanya-tanya apakah kita seharusnya tidak menggunakan bahasa scripting yang tepat (dalam kasus kami kemungkinan besar Ruby) sebagai gantinya.

Bagaimana Anda memutuskan kapan harus menggunakan Perl / Python / Ruby over Bash untuk skrip? Saya pikir skrip init dengan Ruby tidak masuk akal, tetapi bagaimana dengan skrip yang sedikit lebih panjang yang menambahkan akun email?


1
Jika Anda dapat melakukannya dengan menggunakan keduanya, apakah itu penting? Pilihannya hanya menarik jika skrip yang dihasilkan menyajikan perbedaan. Misalnya, waktu eksekusi dapat berbeda secara drastis (bukan masalah saat akun email).
Dennis

Jawaban:


44

Dengan adanya masalah yang bisa diatasi oleh keduanya, Anda sebaiknya menggunakan yang paling nyaman bagi Anda. Pada akhirnya, ada banyak detail kecil, dan hanya pengalaman yang bisa mengajarkan Anda untuk melihatnya.

Bash adalah bahasa scripting tujuan umum seperti Python, Ruby, Perl, tetapi masing-masing memiliki kekuatan yang berbeda dari yang lain. Perl unggul dalam analisis teks, Python mengklaim sebagai yang paling anggun di antara banyak grup, skrip Bash sangat bagus dalam "menyalurkan hal-hal di sekitar", jika Anda tahu apa yang saya maksud, dan Ruby ... well, Ruby sedikit istimewa dalam banyak hal. cara.

Namun, perbedaan di antara mereka hanya penting setelah Anda memiliki jumlah pengalaman skrip yang sehat. Saya sarankan Anda memilih satu bahasa dan mendorongnya ke batas sebelum pindah ke yang berikutnya. Anda dapat melakukan banyak hal dalam skrip shell, lebih dari yang orang akui. Bahasa apa pun sama sulitnya dengan yang Anda inginkan. Setelah Anda menulis beberapa hal di dalamnya, setiap bahasa "mudah" bagi Anda.

Menjadi terbiasa dengan shell terbayar dengan cepat jika Anda tinggal di Linux, jadi mungkin Anda ingin memulai dengan itu. Jika Anda menemukan tugas yang tidak mungkin atau tidak praktis untuk Anda selesaikan dalam skrip shell, gunakan sesuatu yang lain.

Juga, ingatlah bahwa mempelajari skrip shell sangat sederhana. Kekuatan sebenarnya terletak pada program lain, seperti awk, sed, tr, et al.


Saya punya cukup banyak pengalaman dengan bash scripting, seperti halnya Ruby, tapi saya terkadang masih tidak tahu harus menggunakan apa. Memilih berdasarkan preferensi pribadi pada saat itu tampaknya konyol. Tapi Anda benar, saya akan bertanya pada diri sendiri apa yang ingin saya lakukan dan memilih alat terbaik untuk pekerjaan itu.
futlib

Secara pribadi, saya akan menggunakan skala bahasa yang saya kenal dengan baik, dalam urutan kompleksitas dan kekuatan, dan menggunakan yang paling sederhana yang sesuai dengan tagihan. Tapi sungguh, satu-satunya cara untuk mengetahui dengan pasti adalah menulis naskah Anda dalam semua bahasa dan membandingkan hasilnya. Ini semua lebih merupakan firasat daripada suatu kepastian. Setelah beberapa tahun menulis skrip, Anda akan menemukan sebagian besar "jenis masalah", dan tahu bahasa mana yang menyelesaikannya dengan baik.
mkaito

Hanya ingin menambahkan bahwa dengan menggunakan program-program kecil dalam paket GNU coreutils (seperti tr, sort, uniq) dan memipangnya, dimungkinkan untuk menyelesaikan banyak tugas.
GMaster

58

TL; DR - gunakan bash hanya untuk menginstal bahasa yang lebih baik (jika belum tersedia), jika tidak, Anda membuang-buang waktu manusia yang berharga dan tidak terpulihkan. Jika Anda tidak dapat melakukannya di baris perintah dengan tangan tanpa kesalahan, jangan skrip dengan bash / shell.

Ini tahun 2015, jadi saya akan mempertimbangkan yang berikut:

  1. memori di atas kepala

    • Overhead runtime memori Ruby / Python dibandingkan dengan bash kecil (karena shared library), sementara orang mungkin tidak dapat mempertahankan skrip bash non-sepele (yaitu satu dengan> 100 baris) - jadi penggunaan memori bukan merupakan faktor
  2. waktu startup

    • Startup Ruby / Python mungkin sedikit lebih lambat, tetapi kemungkinan Anda tidak akan menjalankan banyak proses Ruby / Python penuh dalam loop ketat 100 kali per detik (jika Anda memiliki jenis-jenis kebutuhan itu, bash / shell adalah terlalu banyak overhead dan Anda mungkin harus turun ke C / C ++)
  3. kinerja

    • hampir semua data tipikal akan lebih cepat di Ruby / Python - atau setidaknya sebanding (atau, Anda membutuhkan C / C ++ / Haskel / OCaml / apa pun)
    • kinerja nyata / bottleneck dalam eksekusi (atau bahkan produktivitas) hampir tidak akan pernah menjadi "kurangnya menggunakan bash / shell" (bahkan Ubuntu switching dash untuk startup menunjukkan bagaimana bash sebenarnya adalah masalah - dan busybox mungkin adalah satu-satunya use case , karena ada yang tidak lebih dari 'bash' dan 'vi' untuk menulis dan menjalankan kode, dan sering ada ada cara untuk menambahkan / download atau menyimpan apa pun)
    • menjalankan proses lain untuk melakukan pekerjaan (seperti sed / awk / grep) sebenarnya jauh lebih lambat daripada memanggil metode pada objek langsung di memori
  4. produktifitas

    • terlalu mudah untuk membuat kesalahan dalam Bash / shell dibandingkan dengan menggunakan metode, parameter, variabel dan pengecualian "nyata" di Ruby / Python
    • Agile adalah arus utama, sementara Bash tidak memiliki dukungan untuk itu (kurang dalam kemampuan pengujian unit, perpustakaan, OO, modularitas, linting, introspeksi, logging, metaprograming; hampir mustahil untuk refactor tanpa merusak sesuatu)
    • terlalu banyak ketidakcocokan dengan shell lain, variabel lingkungan kecil dapat sepenuhnya memecahkan skrip (dan beberapa alat dev-ops penting seperti Wayang mengabaikan garis shebang dan meneruskan atau menulis ulang variabel shell penting), sementara Ruby / Python memiliki migrasi relatif relatif lancar jalur bahkan untuk perubahan versi utama
    • mempelajari bahasa baru memerlukan sebagian kecil dari waktu yang dihabiskan sebagai alternatif debug skrip shell karena masalah spesifik shell (terutama - nama variabel, tidak ada boolean, tanpa pengecualian, dll.)
    • bahkan skrip startup adalah ranjau darat ( terutama karena mereka dapat gagal selama startup sistem ), dan mengingat kelemahan keamanan baru-baru ini dengan bash, Anda mungkin lebih baik menggunakan plain C (dengan perpustakaan yang baik) - ya, C perlu kompilasi, konfigurasi, dll. , tetapi bahkan skrip shell sederhana mungkin memerlukan repositori, lalu versi, lalu pengemasan.
    • apa pun yang tersedia dengan sed / awk / grep kemungkinan sudah dibangun di Ruby / Python - tanpa itu menjadi ketergantungan, atau "perbedaan" antara versi alat-alat tersebut di seluruh platform (jadi bagaimana jika itu bekerja pada pengaturan Anda )
  5. keamanan kerja
    • apa gunanya mendapatkan pekerjaan yang tidak kamu sukai? (kecuali jika Anda suka menghabiskan waktu berjam-jam itu sulit untuk debug tetapi bug skrip shell sepele untuk dibuat)

Saya menemukan tidak ada alasan untuk menggunakan Bash / Shell jika Anda menginstal Ruby / Python.

Dan mungkin menginstal Ruby / Python bahkan tidak memerlukan skrip bash di tempat pertama (dengan pengecualian busybox, beberapa alat sistem bergantung pada Python / Perl tetap ada).

Dan setiap kali Anda menulis skrip shell, Anda "berlatih" melakukan hal itu - alih-alih mempelajari sesuatu yang lebih kuat / produktif.

Mengapa orang menggunakan Bash saat ini? Karena itu kebiasaan yang buruk dan sulit dihilangkan. Sebuah skrip jarang "selesai selamanya" setelah beberapa menit pertama - tidak peduli seberapa kuat orang cenderung berpikir seperti itu. Bersamaan dengan fallacy "itu bug terakhir dalam skrip ini".

Kesimpulan: gunakan bash / shell hanya ketika Anda benar-benar terpaksa (seperti ~/.bashrc, busybox), karena hampir tidak pernah "alat yang tepat untuk pekerjaan" saat ini.


28

Saya menggunakan bash ketika fokus utama saya adalah penanganan file. Ini dapat mencakup memindahkan, menyalin, dan mengganti nama file, serta menggunakan file sebagai input untuk program lain atau menyimpan output program lain dalam file. Saya jarang menulis kode bash yang benar-benar memeriksa isi file atau menghasilkan output untuk menulis ke file; Saya serahkan itu ke program lain (yang bisa saya tulis dalam Perl atau python) yang saya luncurkan melalui bash.

Saya menggunakan Perl dan python ketika fokus utama saya adalah membaca data dari file, memproses data dengan cara tertentu, dan menulis output ke file. Jika saya menemukan diri saya menggunakan (dalam Perl) systemperintah, kembali tik atau (dalam python) subprocessmodul terlalu luas, saya mempertimbangkan untuk menulis skrip dalam bash. Di sisi lain, saya kadang-kadang mulai menambahkan begitu banyak fungsionalitas ke skrip bash yang akhirnya lebih masuk akal untuk menulis ulang dalam Perl / python daripada berurusan dengan dukungan terbatas (dengan perbandingan) bash untuk pelingkupan variabel, fungsi, struktur data, dll. .


2
Saya menggunakan t0 juga memberi jaminan pada Bash setiap kali pembacaan file / pembuatan teks diperlukan, tetapi setelah mengetahui =~operator yang didukung oleh [[ ]]saya telah mencintai saya beberapa Bash untuk pembacaan file sederhana
Freedom_Ben

16

Saya suka kriteria yang ditetapkan dalam posting blog ini .

  • Jika tidak ada argumen untuk dilewati, itu mungkin skrip shell.
  • Jika tidak ada banyak untuk logika kontrol (selain satu putaran atau jika / lain) itu mungkin skrip shell.
  • Jika tugasnya adalah otomatisasi instruksi baris perintah, hampir pasti skrip shell.

8

Saya menemukan analisis Perl versus Bash ini berguna ...

http://blogs.perl.org/users/buddy_burden/2012/04/perl-vs-shell-scripts.html

Untuk kenyamanan, saya menyalin ringkasan dari penulis itu 1) ketika bash adalah temuan yang lebih baik dan 2) ketika perl adalah kesimpulan yang lebih baik ...

Saat Bash Lebih Baik ...

  • Kegagalan Pekerjaan
  • Perintah saat Keluar
  • Memproses Baris Output Pekerjaan
  • Di sini Dokumen
  • Kesetaraan File
  • Membandingkan File Stempel Waktu
  • Ekspansi Tilde

Ketika Perl Lebih Baik ...

Perl masih mengalahkan omong kosong untuk sebagian besar aplikasi. Alasan saya lebih suka Perl termasuk (tetapi tidak terbatas pada):

  • Ini akan menjadi lebih cepat. Terutama karena saya tidak benar-benar harus memulai proses baru untuk banyak hal yang ingin saya lakukan (nama bas dan dirname menjadi contoh yang paling jelas, tetapi secara umum cut, grep, sort, dan wc semua bisa dihilangkan juga).
  • Penanganan string dalam bash belum sempurna, dan seluruh masalah $ IFS sangat kikuk.
  • Persyaratan dalam skrip shell bisa menjadi miring.
  • Mengutip skrip shell bisa menjadi mimpi buruk.
  • Pernyataan kasus bash meninggalkan banyak hal yang diinginkan di luar kasus sederhana (NPI).
  • Array menyedot bash. Hash dalam bash (dengan asumsi bash Anda cukup baru untuk memilikinya) menghisap lebih keras.
  • Setelah memproses file atau output perintah melampaui kasus sederhana yang saya sebutkan di atas, Perl mulai benar-benar merokok bash.
  • CPAN.

Jadi bukan seperti bash akan mengambil alih untuk Perl dalam waktu dekat. Tapi saya masih menemukan, setelah bertahun-tahun, bahwa banyak kali skrip shell sederhana kadang-kadang bisa lebih sederhana daripada skrip Perl sederhana. Seperti yang saya katakan, saya menyambut semua upaya untuk meyakinkan saya sebaliknya. Tetapi, sekali lagi, tidak ada yang salah dengan memiliki beberapa alat berbeda di kotak alat Anda.


Menariknya, di Ruby, semua (?) Poin tidak berlaku, karena Ruby memiliki at_exit (), realpath (), expand_path (), stat (), heredocs, dan exception ( fail "error" unless system("foobar")).
Cezary Baginski

5

Dalam pengalaman saya, bash versus python adalah pertukaran antara waktu pengembangan dan fleksibilitas. Solusi dasar untuk suatu masalah biasanya dapat dibuat dalam skrip bash lebih cepat dari pada skrip python.

Python akan cenderung membuat Anda lebih memikirkan struktur solusi Anda daripada skrip bash yang setara. Python memiliki kekuatan lebih ekspresif daripada skrip bash dan karenanya cenderung untuk skala dan memodifikasi lebih baik dari waktu ke waktu. Itu juga tetap lebih mudah dibaca secara umum.

Bash lebih dekat ke sistem file dan bisa menjadi solusi bagus untuk konsep pertama untuk masalah yang TIDAK didefinisikan dengan baik. Untuk alasan ini, skrip bash mungkin merupakan pilihan pertama yang baik untuk membuat prototipe sesuatu dengan maksud penuh untuk memindahkannya ke python setelah masalahnya dipahami dengan lebih baik.


4

Bash adalah shell Unix yang mencakup bahasa scripting. Ini bukan prosesor perintah. Anda mengontrol cara Anda menjalankan perintah, Anda benar-benar menjalankannya.

Perl / Ruby / Python adalah bahasa tujuan umum.

Saat Anda menginginkan skrip shell, Anda menggunakan Bash

Jika Anda ingin tugas yang lebih kompleks atau tidak terkait dengan shell. Gunakan Python dll.

Saya tidak akan pernah membandingkan bahasa ini sebenarnya. Python dll. Bersifat portabel. Anda dapat menjalankannya di mana saja. Bash hanya untuk Unix.

Python dll. Memiliki banyak pustaka yang dapat digunakan kembali menyelesaikan jutaan tugas.

Hampir sama jika Anda bertanya. "Kapan menggunakan Paint dan kapan menggunakan Photoshop"

Untuk memproses email saya akan menggunakan Ruby, lagi, karena ia memiliki banyak pustaka yang dapat digunakan kembali.

Tapi cara terbaik adalah menggabungkan bash dan ruby. Itu benar. Seperti Anda membuat skrip pemrosesan email dalam skrip ruby ​​dan bash akan memanggil skrip ruby ​​itu dan menjalankan ds commans lainnya.

Jadi, kapan pun Anda membutuhkan pemroses perintah, Anda menggunakan bash. Anda menjalankan perintah unix dan mengendalikannya.

UPDATE setelah 7 tahun (Mar 2019)

Sementara bagian utama dari jawaban saya tidak berubah, saya ingin menunjukkan itu.

Bash juga bahasa scripting yang kuat. Untuk pemrosesan teks, ini bisa menjadi pilihan mutlak yang sah.

Silakan baca komentar mkaito di bawah ini. Semua itu sepenuhnya benar.


1
Himpunan bagian skrip Bash hanya untuk tujuan umum seperti bahasa skrip tujuan umum lainnya. Tambahkan program umum seperti sed ke dalam campuran, dan Anda mendapatkan 90% dari semua kebutuhan scripting yang Anda miliki.
mkaito

1
bash adalah prosesor perintah sehingga kekuatannya adalah dengan menjalankan perintah lain unix dan program di scripts.like mereka yang Anda sebutkan sed dll Dia meminta ketika memilih bahasa tertentu
bakytn

1
Shell memang peluncur program yang dimuliakan, tetapi kemampuan skripnya jauh melebihi itu. Saya sarankan Anda mempelajari beberapa skrip shell nyata.
mkaito

Saya bisa tidur di lantai tetapi saya lebih suka melakukannya di tempat tidur. Bahasa tidak dapat dibandingkan mereka memiliki tujuan yang berbeda.
bakytn

2
Nah, jika Bash adalah lantai, sesuatu seperti Haskell harus menjadi papan paku :-)
mkaito

1

Skrip shell seperti bash, ksh, zsh, sh, dan fish terkenal mengejutkan, dibandingkan dengan bahasa tujuan umum tingkat tinggi seperti Ruby, Python, atau Perl. Sementara skrip shell dapat memulai kehidupannya sebagai file yang lebih pendek daripada skrip tujuan umum yang setara, kejutan menyebabkan banyak kode pembungkus defensif, seperti set -euo pipefailmengaktifkan mode ketat.

Sebagai contoh, sebagian besar bahasa shell melanjutkan mengeksekusi baris dalam skrip shell, bahkan ketika salah satu perintah gagal. Sebaliknya, bahasa tujuan umum gagal segera pada kesalahan pertama, dan sering kali berat, menghasilkan perilaku yang lebih aman, lebih dapat diprediksi dalam skrip bahkan kompleksitas cahaya.


1

Artikel yang sangat bias.

Saya tidak menemukan bash terlalu sulit untuk di-debug. Python seringkali terlalu kaku, sedangkan bash memungkinkan Anda menjadi sangat kreatif. Jika Anda seorang pemikir yang baik, Anda akan menyukai bash.

Saya menjalankan skrip bash pada jutaan sekuensing DNA yang dibaca dalam ribuan file, dan itu cukup membantu saya. Dan bertentangan dengan apa yang dikatakan semua orang, versi skrip yang sama dalam C ++ tidak benar-benar berjalan lebih cepat (pada beberapa menit pisahkan).

Saya pikir bash, seperti perl, bukan yang paling ramah pengguna / mudah dibaca. Itu membuat orang takut karena kebanyakan orang bukan pemikir abstrak yang hebat. Tetapi programmer yang lebih cerah dan lebih kreatif cenderung menyukainya dan sering menggunakannya. Jika Anda mengenal diri sendiri dan Anda tahu memiliki otak, jangan takut dengan bash. Jika Anda seorang pemikir dasar, mungkin tetap berpegang pada sesuatu seperti Python. Untuk masing-masing.


0

Dari "Buku Llama,"

  • Randal L. Schwartz, Tom Phoenix, dan brian d foy, Learning Perl (Sebastopol, CA: O'Reilly, 2011), ch. 1.2 "Untuk apa Perl?" , §§ "Mengapa Tidak Larry [pencipta Perl] Hanya Gunakan Beberapa Bahasa Lain?", Hal. 5:

Perl mencoba mengisi celah antara pemrograman tingkat rendah (seperti dalam C atau C ++ atau perakitan) dan pemrograman tingkat tinggi (seperti pemrograman "shell" [mis. bash]). Pemrograman tingkat rendah biasanya sulit untuk ditulis dan jelek, tetapi cepat dan tidak terbatas; sulit untuk mengalahkan kecepatan program tingkat rendah yang ditulis dengan baik pada mesin yang diberikan. Dan tidak banyak yang tidak bisa Anda lakukan di sana. Pemrograman tingkat tinggi, di sisi lain, cenderung lambat, keras, jelek, dan terbatas; ada banyak hal yang tidak dapat Anda lakukan sama sekali dengan pemrograman shell atau batch jika tidak ada perintah pada sistem Anda yang menyediakan fungsionalitas yang diperlukan. Perl mudah, hampir tidak terbatas, sebagian besar cepat, dan agak jelek.


0

Sebagai aturan praktis, gunakan bahasa paling sederhana yang memiliki kinerja yang cukup baik untuk tugas Anda. Dan kekhasannya hanya sampai batas mereka benar-benar berguna.

Dan tentang keterbacaan, Bash mengerikan jika gaya pemrograman Anda mengerikan. Jika Anda hanya membuang kode di sana, itu menjadi tidak jelas.

Tetapi jika Anda membagi kode menjadi fungsi terpendek , dan menamai berbagai hal dengan cara yang mudah dimengerti, itu adalah bahasa yang paling jelas yang dapat Anda temukan. Karena ini sangat singkat.

Sebagai spesimen, ini adalah kode terbaru saya di Bash. Perhatikan betapa mudahnya memahami dan mengetiknya:

#! /bin/bash


mainFunction () {
    file="${1}"

    checkFile "${file}"
    executeFile "${file}"
}


changeToThisProgramDir () {
    cd "$( dirname "${BASH_SOURCE[0]}" )"
}


checkFile () {
    file="${1}"

    checkFileNotEmpty "${file}"
    checkFileExist "${file}"
    checkFileIsExe "${file}"
}


checkFileExist () {
    file="${1}"

    if [ ! -f "${file}" ]; then
        echo "The file doesn't exist: ${file}" >&2
        echo "If the name was correct either type: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}


checkFileIsExe () {
    file="${1}"
    mime=$(fileMime "${file}")

    if [ "${mime}" != "application/x-dosexec" ]; then
        echo "Not an exe: ${file}" >&2
        exit 1
    fi
}


checkFileNotEmpty () {
    file="${1}"

    if [ "${file}" == "" ]; then
        echo "No file specified" >&2
        echo "Either type this: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}


execute () {
    function="${1}"
    command="${2}"
    error=$(eval "${command}" 2>&1 >"/dev/null")

    if [ ${?} -ne 0 ]; then
        echo "${function}: ${error}" >&2
        exit 1
    fi
}


executeFile () {
    file="${1}"
    type=$(fileType "${file}")

    if [ "${type}" == "MS-DOS executable" ]; then
        execute "executeFile" "dosbox \"${file}\" -forcescaler normal2x -exit -fullscreen"
    else
        execute "executeFile" "wine \"${file}\""
    fi
}


fileMime () {
    file="${1}"

    attributes=$(file --brief --mime "${file}")
    IFS=";" read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}


fileType () {
    file="${1}"

    attributes=$(file --brief "${file}")
    IFS="," read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}


changeToThisProgramDir
mainFunction "${@}"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.