Kekuatan Skrip Shell dibandingkan dengan Python [tertutup]

94

Saya mencoba mempelajari skrip shell (bash) beberapa kali tetapi didorong oleh sintaks. Kemudian saya menemukan Python dan dapat melakukan sebagian besar hal yang dapat dilakukan skrip shell dengan Python. Saya sekarang tidak yakin apakah saya harus menginvestasikan waktu saya untuk mempelajari skrip shell lagi. Jadi saya ingin bertanya:

Apa kekuatan skrip shell yang menjadikannya alat yang sangat diperlukan dibandingkan dengan Python?

Saya bukan seorang sistem administrasi berdasarkan profesi, tetapi saya tertarik untuk mengatur sistem Linux untuk pengguna rumahan, oleh karena itu saya pikir mempelajari skrip shell dapat menjadi diperlukan.

Amol Gawai
sumber

Jawaban:

82
  • Skrip shell memiliki notasi yang lebih sederhana untuk pengalihan I / O.
  • Lebih mudah membuat pipeline dari program yang ada di shell.
  • Skrip shell menggunakan kembali seluruh program.
  • Shell tersedia secara universal (pada apa pun seperti Unix) - Python belum tentu diinstal.

Benar bahwa Anda dapat melakukan segala sesuatu dengan Python yang dapat Anda lakukan di shell; Ini juga benar bahwa ada hal-hal yang mudah di Python yang keras di shell (sama seperti ada hal-hal yang mudah di shell tapi sulit di Python). Mengetahui keduanya akan menjadi yang terbaik dalam jangka panjang.

Jonathan Leffler
sumber
16
1 dan 2, poin bagus. # 3 adalah kelemahan, karena mengarah ke banyak overhead yang dapat dihindari Python. # 4 mungkin sebagian besar tidak benar. Python adalah bagian dari kebanyakan distro Linux sekarang.
S. Lott
1
@Svante: tulis loop shell sederhana untuk melakukan sejumlah operasi menggunakan perintah seperti "test" dan "expr" dan bandingkan waktu proses dengan skrip Python yang menggunakan modul "os". Perintah seperti test dan expr sering kali melibatkan percabangan subproses untuk melakukan pekerjaan yang sebenarnya.
S. Lott
2
Saya melihat poin 3 sebagai keuntungan besar, bukan kerugian. Misalnya, pertimbangkan untuk mengubah ukuran direktori yang penuh dengan gambar dengan program konversi.
Glenn
7
Yang juga perlu diperhatikan sehubungan dengan # 4 adalah bahwa bashshell secara khusus tidak tersedia secara universal di semua distro linux, khususnya untuk sistem tertanam, dan lainnya yang menjalankan busyboxexecutable. Skrip yang menargetkan shell Bourne itu sendiri, yang bashkompatibel dengan versi sebelumnya, akan berjalan pada semua sistem yang mendukung POSIX, namun bahasanya jauh lebih terbatas daripada yang diterapkan oleh bash.
Intuisi
5
@intuited: eval "$ (history 2 | head -1 | perl -pe 's / (? <= yang mana) lebih mungkin / setidaknya /')"; history -d $ (history 2 | head -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
dirilis
54

"Apa kekuatan skrip shell yang menjadikannya alat yang sangat diperlukan dibandingkan dengan Python?"

Cangkangnya tidak bisa diabaikan. Menurut Anda mengapa ada begitu banyak? bash, tcsh, csh, sh, dll., dll.,

Python adalah cangkang. Bukan yang Anda gunakan untuk menjalankan semua perintah, tetapi untuk skrip, itu ideal.

Python adalah bagian standar yang kurang lebih dari semua distro Linux.

Kerang yang lebih tradisional melakukan terlalu banyak hal.

  1. Mereka memiliki antarmuka pengguna yang berguna untuk menjalankan perintah. Ini termasuk perintah satu baris di mana shell mencari PATH Anda, bercabang dan mengeksekusi program yang diminta. Ini juga termasuk pipeline, sequences dan program bersamaan (menggunakan ;, |dan &) serta beberapa pengalihan (menggunakan >dan <).

  2. Mereka memiliki kemampuan seperti bahasa pemrograman yang payah untuk menjalankan skrip. Bahasa ini agak sulit digunakan dan sangat tidak efisien. Kebanyakan pernyataan dalam bahasa ini membutuhkan forking satu atau lebih proses tambahan, membuang-buang waktu dan memori.

Menjalankan program dari shell, mengarahkan stderr ke file log dan hal semacam itu bagus. Lakukan itu di cangkang.

Hampir semua hal lainnya dapat dilakukan dengan lebih efisien dan lebih jelas sebagai skrip Python.

Anda membutuhkan keduanya . Namun, Anda tidak boleh menulis skrip dengan pernyataan-if atau loop dalam bahasa shell tradisional.

S. Lott
sumber
1
@intan. A) Perkembangbiakan cangkang yang berbeda membuktikan jumlah fitur yang bertambah menjadi "cangkang"; bukan itu peran penting, tetapi itu semua untuk fitur. B) Penerjemah python adalah shell unix yang tepat, menggunakan # !. C) ifPernyataan shell "sederhana" sering kali melibatkan menjalankan testprogram. Shell adalah bahasa pemrograman yang payah dalam segala hal.
S. Lotot
4
@. Lott: Sepertinya beberapa disonansi semantik ada di sirkuit sini. Definisi saya tentang shell UNIX adalah penerjemah yang bahasanya terutama diarahkan untuk mengendalikan, pada tingkat tinggi, pengoperasian sistem UNIX. Dengan definisi ini, sejenis shell tentu penting untuk pengoperasian sistem UNIX, dan Python tidak memenuhi syarat. Bagaimana Anda mendefinisikan istilah itu?
Intuisi
1
@ S. Lott: Saya bukan penggemar berat sintaks yang digunakan dalam skrip shell tradisional, tetapi menurut saya cukup dapat digunakan, dan sesuai dalam banyak situasi di mana tujuan utamanya adalah untuk mengontrol proses dan aliran keluarannya. Ini sering kali membutuhkan pengambilan keputusan dan pengulangan. Kerang modern ( bash, setidaknya) memiliki bawaan untuk menangani pengambilan keputusan (misalnya testadalah bashbawaan, selain konstruksi yang lebih serbaguna). Ini pasti ada kelemahannya, tapi juga kelebihannya. Ini juga layak dipelajari secara mendetail karena memiliki paradigma yang sangat berbeda dari jenis bahasa lainnya.
Intuisi
1
@intuited: "merasa cukup berguna" adalah penghormatan untuk keahlian Anda, bukan bahasa yang jelek. Python bisa lebih berguna oleh orang yang tidak ahli.
S. Lotot
3
@ S. Lott: Menarik, Anda memiliki filosofi yang sangat berbeda dari saya. Saya merasa desain dan operasi pada dasarnya adalah ayam dan telur. Ini untuk mengatakan bahwa skrip shell adalah program yang menjalankan program. Banyak dari program tersebut pada awalnya diimplementasikan sebagai skrip shell yang semakin kompleks. Pada titik tertentu itu menjadi berharga, mungkin demi efisiensi sebagai modularitas, untuk beberapa di antaranya akan ditulis ulang dalam C, dan kemudian, Python. Misalnya: di beberapa titik cat "$1" | ssh "$2" "cat - >\"$1\""begat scp. Mereka tahu cara terbaik merancangnya karena mereka sudah menggunakannya.
Intuisi
31

Shell membuat tindakan umum dan sederhana menjadi sangat sederhana, dengan mengorbankan hal-hal yang lebih kompleks menjadi jauh lebih kompleks.

Biasanya, skrip shell kecil akan lebih pendek dan sederhana daripada program python yang sesuai, tetapi program python akan cenderung menerima modifikasi dengan baik, sedangkan skrip shell akan cenderung semakin tidak dapat dipelihara saat kode ditambahkan.

Ini memiliki konsekuensi bahwa untuk produktivitas hari-hari yang optimal Anda memerlukan skrip shell, tetapi Anda harus menggunakannya sebagian besar untuk skrip sekali pakai, dan gunakan python di tempat lain.


sumber
14

Tidak ada yang dapat Anda lakukan dengan skrip shell yang tidak dapat Anda lakukan dengan python. Keuntungan besar dari skrip shell adalah Anda menggunakan perintah yang sama seperti yang Anda lakukan saat menggunakan shell, jadi jika Anda pengguna shell yang berat, skrip shell pada suatu saat akan menjadi cara yang sangat cepat dan mudah untuk mengotomatiskan kerja shell Anda. .

Saya juga merasa lebih mudah untuk menangani pipa data dalam skrip shell daripada dengan python, meskipun itu benar-benar bisa dilakukan dari python.

Dan, akhirnya, Anda tidak perlu menjalankan interpeter tambahan untuk menjalankan skrip shell, memberi Anda keuntungan yang sangat kecil, tetapi terkadang mungkin terlihat dari kecepatan dan penggunaan memori.

Tapi sekali lagi, skrip Python jauh lebih mudah dipelihara, saya mencoba bermigrasi dari skrip shell jelek besar ke skrip Python karena alasan itu. Ini juga lebih mudah untuk melakukan penanganan pengecualian dan QA dengan Python.

elzapp
sumber
9

seseorang tidak perlu mempelajari skrip shell, seperti yang ditunjukkan oleh semua jawaban sebelumnya; tetapi belajar bukanlah hal yang buruk. ini benar-benar masalah prioritas pribadi. sangat sulit bagi orang lain untuk memberi tahu Anda apa yang pantas dan tidak sepadan dengan waktu Anda.

sebagian besar pemrogram merasa bahwa mempelajari bahasa baru semakin mudah setiap saat. (hal yang sama juga terjadi pada bahasa alami.) dan semakin awal Anda mulai, semakin baik.

plus: setelah mempelajari suatu bahasa memungkinkan Anda untuk secara boros menghilangkan keterbatasannya dari posisi pengetahuan dan keakraban yang lengkap. ini mungkin tidak akan membuat Anda santai, tetapi mungkin memberi Anda bir dari teman-teman Anda!

adrianrf.dll
sumber
8

Saya setuju dengan sebagian besar jawaban sebelumnya. Saya menganggap perintah shell paling cocok untuk melakukan tugas berorientasi sistem file (menyalin dan memindahkan file, grep, dll). Shell lebih baik, menurut pendapat saya, jika Anda harus membaca dan menulis ke file, karena satu >>file.txtpengalihan ditambahkan ke file secara instan, daripada membutuhkan, katakanlah file=open('file.txt','a'); file.write(), dll.

Saat ini, untuk penggunaan pribadi saya, saya mencampur keduanya, membuat skrip python dan memanggil os.system ('command') atau os.popen ('command') setiap kali beberapa tindakan lebih mudah di shell daripada di python.

heltonbiker
sumber
6

Cangkangnya tersedia di mana-mana. Jika Anda tetap menggunakan serangkaian fungsionalitas portabel yang relatif mendasar, skrip Anda dapat berjalan di ponsel, router nirkabel, DVR, netbook, workstation, server besi besar, dan sejenisnya. Python tidak selalu disertakan di luar kotak pada banyak sistem, dan tergantung pada lingkungan, mungkin sulit untuk menginstalnya.

Mempelajari beberapa skrip shell juga dapat membantu Anda mempelajari beberapa trik baris perintah, karena baris perintah adalah shell. Ini juga bagus untuk mengambil beberapa baris perintah yang cukup panjang dan rumit, dan mengubahnya menjadi skrip yang lebih umum setelah Anda menyadari bahwa Anda akan membutuhkannya lagi.

Shell juga memiliki beberapa fitur yang cukup kuat; pipelines adalah konstruksi kontrol yang sangat menarik yang hanya berasal dari shell, sejauh yang saya tahu.

Brian Campbell
sumber
5

Hal lain yang perlu dipertimbangkan saat memilih skrip shell Python adalah versi Python yang akan dijalankan pada mesin target. RHEL5 (untuk menyebutkan satu) akan ada untuk waktu yang lama. RHEL5 macet dengan Python 2.4. Ada banyak pustaka bagus yang bergantung pada fungsionalitas yang ditambahkan ke Python post-2.4.

nscott
sumber