Apa kelebihan skrip shell daripada bahasa pemrograman yang ditafsirkan? [Tutup]

15

(Saya tidak yakin apakah itu pertanyaan yang sesuai di sini)

Script shell, seperti yang ditulis bash, dapat melakukan banyak hal. Mereka dapat memanggil program Unix, menyalurkan outputnya, mengalihkan I / O dari / ke file, mengontrol aliran, memeriksa apakah ada file, dll.

Tetapi bahasa pemrograman modern, misalnya, pythondan ruby, juga dapat melakukan hal-hal ini. Dan, mereka (saya pikir) lebih mudah dibaca dan dipelihara.

bashmenikmati adopsi penyebaran luas. Tetapi banyak distribusi telah menginstal pythoninterpreter juga.

Jadi apa kelebihan shell script? Jika saya bisa menulis python, rubyatau perl, apakah itu layak untuk dipelajari bash?

Lai Yu-Hsuan
sumber
3
Jika Anda banyak bekerja dengan sistem Unix, Anda harus mempelajari bash dan juga shell Unix populer lainnya.
Bernard

Jawaban:

30

Shells memiliki fitur khusus untuk bekerja dengan file dan memasukkan data dari satu program ke program lain (dengan asumsi data adalah teks). Untuk tugas-tugas itu, skrip shell bisa menjadi lebih rumit daripada bahasa skrip seperti Python.

Script Shell juga memiliki keuntungan bahwa perintah yang Anda gunakan pada dasarnya adalah perintah yang sama yang akan Anda gunakan dari baris perintah - jadi jika Anda dapat melakukan sesuatu di shell, Anda lebih dari setengah jalan untuk membuat skrip operasi yang sama.

Di sini misalnya adalah skrip bash yang memindahkan semua file PNG dari direktori saat ini ke direktori yang ditentukan.

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

Ini versi Python.

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

Anda akan melihat:

  • Skrip bash adalah yang ketiga sepanjang Python jika Anda menghitung garis (tidak termasuk garis shebang) - apalagi dengan jumlah karakter
  • Skrip Python membutuhkan tiga pustaka yang akan diimpor, sementara semua yang Anda butuhkan untuk tugas ini tersedia secara native di bash
  • Skrip Python membutuhkan loop eksplisit untuk memindahkan file, sedangkan itu adalah bagian dari semantik dari mvperintah di bash
  • Skrip bash dapat berjalan lebih cepat - Anda mungkin akan memanggilnya dari bash, dan Anda dapat menggunakannya sourceuntuk menjalankannya di instance shell yang sama
  • glob.iglob("./*.png") cukup seteguk hanya untuk mengatakan *.png

Jika Anda ingin menulis operasi pipa dasar dengan Python, Anda akan terkejut dengan verbositasnya. (Tentu saja, beberapa hal, seperti pemipaan melalui grep, dapat diganti dengan kode Python daripada menggunakan program eksternal, jadi Anda sering tidak perlu mem-pipe cukup banyak.)

Sebagai contoh tandingan, saya pernah harus menulis rutin yang memeriksa untuk melihat berapa lama masing-masing nama file dalam direktori tertentu. Jika mereka lebih lama dari yang didukung oleh OS tertentu, mereka harus dipersingkat. Ini dapat menghasilkan duplikat nama file, yang perlu saya ralat, dan karena mereka akan ditautkan dari halaman Web, nama yang disingkat harus stabil, yaitu, mereka harus dibuat sedemikian rupa sehingga nama file yang sama akan selalu menghasilkan nama file pendek yang sama. Saya melakukan ini dengan menghasilkan hex md5 dari nama file panjang dan menambahkan empat karakter pertama itu ke nama singkat (nama masih bisa bertabrakan, tapi itu sangat tidak sopan, jadi saya hanya memeriksa kondisi itu dan menebus jika itu terjadi) .

Saya melakukan ini di bash karena itu adalah bagian dari sistem build kami yang sudah ditulis dalam bash. Persis sulit untuk mendapatkan yang benar seperti yang mungkin Anda pikirkan. Butuh waktu lebih sedikit untuk menulis dengan Python dan mungkin akan lebih jelas juga.

Singkatnya: berbagai bahasa dirancang untuk berbagai jenis tugas; pilih bahasa yang tersedia untuk Anda yang paling sesuai dengan tugas yang ada.

baik hati
sumber
Anda tidak dapat melakukan hal yang sama di perl # / usr / bin / perl mv *.png $1(komentar tidak mempertahankan format) tetapi dengan perl Anda juga dapat menggunakan fitur bahasa tingkat yang lebih tinggi.
Poma
19

Jawaban yang ada juga valid, tetapi ada satu alasan yang belum disebutkan: karena AKAN ada di sana.

Setiap instalasi * nix dilakukan dengan beberapa paket opsional yang mungkin atau mungkin tidak dimuat, dan tidak semua sistem memiliki Python atau Perl atau Ruby. Tetapi jika sistem diharapkan memiliki kemampuan interaktif sama sekali, itu akan memiliki shell. Ini berarti bahwa skrip shell akan bekerja pada sistem dari server ke desktop programmer ke desktop sekretaris thin-client ke perangkat tertanam, pada sistem apa pun yang mendukung sistem file yang dapat ditulis dan baris perintah bash.

Untuk seseorang yang hanya pernah bekerja di lingkungan server yang konsisten, ini adalah sesuatu yang dapat diterima begitu saja, dan tidak begitu penting. Untuk seseorang yang bekerja di lingkungan yang lebih bervariasi, ini tidak boleh diabaikan.

Erik Johnson
sumber
9

Sebagian besar dari pertanyaan Anda dijawab di sini:

Mengapa bahasa scripting (misalnya Perl, Python, Ruby) tidak cocok sebagai bahasa shell?

Berikut kutipan dari jawaban saya untuk pertanyaan itu :

Ada beberapa perbedaan yang bisa saya pikirkan; hanya berpikir di sini, tanpa urutan tertentu:

  1. Python & Co. dirancang untuk menjadi ahli dalam scripting. Bash & Co. dirancang hanya untuk bisa menulis dengan baik, tanpa kompromi sama sekali. TKI: Python dirancang untuk menjadi baik di scripting dan non-scripting, Bash hanya peduli tentang scripting.

  2. Bash & Co. tidak diketik, Python & Co. diketik sangat, yang berarti bahwa jumlah 123, string, 123dan file 123sangat berbeda. Mereka, bagaimanapun, tidak diketik secara statis , yang berarti mereka perlu memiliki literal yang berbeda untuk itu, agar mereka terpisah. Contoh:

    • Ruby: 123(angka), Bash:123
    • Ruby: '123'(string), Bash:123
    • Ruby: /123/(regexp), Bash:123
    • Ruby: File.open('123')(file), Bash:123
    • Ruby: IO.open('123')(deskriptor file), Bash:123
    • Ruby: URI.parse('123')(URI), Bash:123
    • Ruby: `123`(perintah), Bash:123
  3. Python & Co. dirancang untuk meningkatkan hingga 10.000, 100000, bahkan mungkin 10.00000 program baris, Bash & Co. dirancang untuk mengurangi hingga 10 program karakter .

  4. Di Bash & Co., file, direktori, deskriptor file, proses semua objek kelas satu, dengan Python, hanya objek Python kelas satu, jika Anda ingin memanipulasi file, direktori, dll., Anda harus membungkusnya dalam Objek Python pertama.

  5. Pemrograman shell pada dasarnya adalah pemrograman dataflow. Tidak ada yang menyadari itu, bahkan orang-orang yang menulis kerang, tetapi ternyata kerang cukup bagus dalam hal itu, dan bahasa tujuan umum tidak begitu banyak. Dalam dunia pemrograman tujuan umum, dataflow tampaknya sebagian besar dipandang sebagai model konkurensi, bukan sebanyak paradigma pemrograman.

Saya merasa bahwa mencoba mengatasi titik-titik ini dengan mengunci fitur atau DSL ke bahasa pemrograman tujuan umum tidak berhasil. Setidaknya, saya belum melihat implementasi yang meyakinkan dari itu. Ada RuSH (Ruby shell), yang mencoba mengimplementasikan shell di Ruby, ada rush, yang merupakan DSL internal untuk pemrograman shell di Ruby, ada Hotwire, yang merupakan shell Python, tetapi IMO tidak ada yang datang bahkan menutup untuk bersaing dengan Bash, Zsh, ikan dan teman-teman.

Jörg W Mittag
sumber
Tautan Patah: Di manakah pertanyaan (dan jawaban) yang Anda rujuk sekarang? Atau semua yang berguna disalin di sini?
Wolf
1
@ Wolf: Rupanya, itu dihapus karena di luar topik, setelah hampir tiga tahun. Sangat disayangkan.
Jörg W Mittag
1
Inilah versi yang diarsipkan dari pertanyaan itu: web.archive.org/web/20140528035940/http://stackoverflow.com/…
waldyrious
1

Saya akan mengatakan skrip shell memiliki keuntungan dalam situasi di mana Anda hanya ingin menyiapkan tugas otomatis super sederhana. Misalnya, jika Anda ingin menulis skrip yang mencadangkan direktori dari satu server ke server lainnya setiap hari pada pukul 5:00, akan sulit untuk menggunakan bahasa pemrograman tugas berat.

Di sisi lain, jika tugas pemrograman Anda lebih membutuhkan struktur kontrol (jika / kemudian / lain), struktur berulang (perulangan), basis data & file I / O, dll, maka mungkin lebih cocok untuk yang lebih mampu bahasa pemrograman dari skrip shell.

Saya pikir aturan praktis yang baik adalah:

automatingSimpleTask ? shellScript() : programmingLanguage();
CFL_Jeff
sumber
2
Bukankah seharusnya shellScript() if automatingSimpleTask else programmingLanguage() lol.
gahooa
1
@ gahooa haha ​​menunjukkan di sisi mana aku berada!
CFL_Jeff
1

Meskipun Anda dapat meluncurkan program dari program python / ruby ​​/ apa pun, itu berbeda di shell. Anda mungkin perlu menggunakan API untuk meluncurkan sesuatu - fork () misalnya. Dalam skrip shell, program berperilaku lebih seperti fungsi dalam bahasa pemrograman konvensional dan dapat dieksekusi, disalurkan, dll dengan upaya minimal. Alur data sangat jelas menggunakan pipa juga.

phkahler
sumber
0

Jika Anda benar-benar bebas memilih bahasa pemrograman yang Anda gunakan untuk tugas-tugas tertentu, Anda mungkin bisa hampir sepenuhnya menghindari belajar bash dan melakukan setiap tugas pemrograman skrip dengan Perl, Python atau Ruby. Ini kadang-kadang dapat mengarah pada solusi yang lebih verbose, terutama dalam kasus ketika Anda hanya memerlukan skrip yang memanggil urutan alat Unix lainnya, tetapi dalam kasus yang lebih kompleks Anda benar, bahasa skrip modern memberi Anda lebih banyak kemungkinan untuk menulis kode yang dapat dikelola dengan lebih baik (mereka memberi Anda lebih banyak kemungkinan untuk menulis kode yang dikaburkan, tapi itu pilihan Anda).

Di sisi lain, sering kali kita tidak bebas memilih bahasa yang paling kita sukai, karena kita harus bekerja dengan kode lawas atau kode yang ditulis oleh orang yang tahu bash tetapi tidak tahu salah satu bahasa skrip yang Anda sebutkan.

Doc Brown
sumber
0

Shell scripting adalah bahasa pemrograman yang ditafsirkan. Berikut adalah beberapa alasan mengapa saya memilih untuk menulis skrip di bash daripada perl atau python atau bahasa skrip lain:

Bekerja di mana saja : Penerjemah yang lebih kompleks mungkin tidak selalu tersedia, seperti saat startup sistem atau pada sistem embedded. Bash tersedia bahkan di busybox.

Bekerja pada baris perintah : Jika Anda berpengalaman dalam skrip shell, Anda dapat menggunakan keterampilan itu untuk melakukan hal-hal kompleks dalam skrip ad-hoc tepat di baris perintah. Saya menggunakan keterampilan ini setiap hari sebagai sysadmin.

Lebih mudah menulis program yang memanggil program lain: Jika apa yang Anda coba lakukan adalah mengaitkan beberapa program yang ada bersama-sama dengan cara yang menarik, itu bisa lebih mudah dilakukan dalam skrip shell daripada dengan bahasa tingkat yang lebih tinggi.

Jika program ini 30 baris atau kurang, saya biasanya akan menulisnya menggunakan skrip shell. Jika ada manipulasi kompleks atau kompleks atau analisis yang harus dihadapi, saya akan melakukannya menggunakan python atau perl.

tylerl
sumber
-1

Anda harus melihat pada coffeescript. Kata-kata mereka:

Di balik semua kawat gigi dan titik koma yang canggung itu, JavaScript selalu memiliki model objek yang indah. CoffeeScript adalah upaya untuk mengekspos bagian-bagian yang baik dari JavaScript dengan cara sederhana.

Aturan emas CoffeeScript adalah: "Ini hanya JavaScript".

Nah ... inilah jawaban super-pemula.

Sebagai pemula yang belajar otomatis selama 6 bulan terakhir, dan mencicipi sedikit C, C ++, Javascript, dan lebih banyak Bashscript dalam beberapa hari terakhir ... Saya dapat memberi tahu Anda:

Skrip shell, seperti yang ditulis dalam bash, dapat melakukan banyak hal. Mereka dapat memanggil program Unix, menyalurkan outputnya, mengalihkan I / O dari / ke file, mengontrol aliran, memeriksa apakah ada file, dll.

dan bukankah ini sederhana, fantastis! ? loop dan variabel? Wow!

python dan ruby, juga bisa melakukan hal-hal ini. Dan, mereka (saya pikir) lebih mudah dibaca dan dipelihara.

Tolong, beri tahu saya di mana Anda melihat ini? Saya menulis bashscript di gedit bahkan di geany dan saya bisa memformat, (tab?) Dan saya membaca kode saya dalam kecepatan cahaya menggunakan bashscript sebagai perbandingan pada bahasa lain.

Apakah bahasa ini memiliki alat lain untuk menjaga ketertiban? Saya tahu berorientasi objek menyimpan BANYAK kode, tetapi ... orang mengatakan bashscript juga OO! WOW 2! Itu maksud saya di sini. Pergi ke:

keuntungan dari shell a script

ada di dalam pertanyaan ini: Bagaimana melakukan apa yang bisa dilakukan bashdamn ini di perl atau phyton atau ruby? Mudah?

( bashdamnthing = xdotool )

H_7
sumber
Apa yang terjadi di sini? Itu seperti jawaban Doge ..
naught101