Bahasa scripting yang paling universal untuk Linux adalah?

24

Kami sedang menulis skrip untuk sistem Linux, telah ada beberapa perdebatan tentang apa yang akan menjadi bahasa scripting Linux yang paling universal saat ini untuk digunakan. Bash, SH, Posix? Apa?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3
Saya kira sh.
Blender
Apakah Anda memiliki daftar distro target? Atau distro wajib / diinginkan yang harus dijalankan?
4
"SH"? Apa "sh"? Shell Thomson? kulit Bourne? bash, ksh, pdksh, ash, zsh seperti yang ditemukan /bin/shpada sistem X atau Y ? Spesifikasi sh POSIX, spesifikasi SUSv3, SUSv4 sh, spesifikasi sh LSB? "sh" dengan sendirinya tidak berarti apa-apa.
Stéphane Chazelas
1
Jika ini untuk pembuatan perangkat lunak dan menginstal skrip, Anda mungkin ingin memeriksa Autotools, yang mencoba untuk menyelesaikan masalah kompilasi lintas-sistem.
Lie Ryan
1
@sch Persimpangan umum yang paling portabel, "jelas". Jika orang yang tidak terbiasa dengan kerang Unix disesatkan oleh komentar Anda, spesifikasi POSIX diimplementasikan oleh hampir semua kerang kontemporer yang berani menggunakan namanya sh, dan ketidaksesuaian shyang tidak kuno dan langka saat ini (misalnya Bourne). Seseorang dapat mengeluarkan daftar ekstensi dan variasi yang terus bertambah, tetapi jika tujuannya "universal" atau mudah dibawa, orang harus menuju arah yang berlawanan. Jawaban Gilles mencakup detail secara lebih mendalam.
jw013

Jawaban:

38

Ada dua lingkungan pemrograman yang tersedia pada setiap sistem operasi mirip-unix, yang Turing-complete dan yang dapat memanggil program lain: awk , dan sh , keluarga shell Bourne / POSIX. AWK berorientasi pada pemrosesan teks (ini melengkapi utilitas yang lebih khusus), sementara ia berorientasi pada menjadi bahasa lem untuk menyatukan program. Sh adalah yang bahasa scripting yang universal di Linux dan di seluruh dunia unix.

Standar POSIX mendefinisikan fitur wajib sh itu sendiri dan utilitas terkait. Sebagian besar sistem mirip-unix mematuhi POSIX 1003.1-2004 (alias Single Unix v3, alias edisi Open Group Base Specification 6); versi terbaru dari standar itu adalah POSIX 1003.1-2008 (alias Single Unix v4, alias Open Group Base Specification Issue 7).

Setiap Linux dan sistem unix atau Unix-like memiliki shell Bourne-style di jalan /bin/sh, dan setiap sistem non-antik memiliki shell yang sesuai dengan POSIX (kecuali bug sesekali). Setiap sistem seperti unix modern (termasuk Linux) mendukung shebang , sehingga secara otomatis menjalankan skrip /bin/shjika baris pertama adalah #!/bin/sh. Ada sistem POSIX di mana shterletak di tempat lain (biasanya lapisan emulasi pada OS Anda tidak akan dianggap sebagai benar-benar seperti Unix).

Sistem Linux Tertanam mungkin memiliki sistem BusyBox yang tidak dapat mengimplementasikan semua fitur POSIX. BusyBox memiliki sejumlah besar opsi waktu kompilasi untuk mengakomodasi sistem footprint kecil, sehingga sulit untuk mengetahui apa yang diharapkan sebelumnya, Anda harus menyesuaikan skrip Anda dengan perangkat tertentu. BusyBox adalah implementasi kecil-tapak yang paling umum dari utilitas sh dan bermacam-macam; satu lagi yang mungkin Anda temui adalah lingkungan shell yang sangat berkurang di Android (versi yang lebih baru kurang anemia).

Non-embedded system Linux hampir selalu memiliki baik dasbor atau pesta sebagai /bin/sh. Dash adalah shell kecil dan cepat yang mengimplementasikan sedikit lebih banyak dari fitur POSIX. Bash adalah shell yang lebih besar dengan lebih banyak fitur.

Sistem Linux yang tidak tertanam hampir selalu memiliki Bash yang diinstal sebagai /bin/bash. Oleh karena itu, untuk portabilitas pada sistem Linux yang tidak tertanam, Anda dapat mengasumsikan bahwa bash tersedia. Di antara fitur tambahan yang berguna dari bash adalah array, kemampuan untuk mengatasi file dot dengan mudah, pipestatusvariabel untuk mendapatkan status pengembalian semua perintah dalam pipa, operator perbandingan tambahan untuk waktu file, dan (dalam versi terbaru) pencocokan ekspresi reguler .

Salah satu karakteristik pemrograman shell adalah Anda tidak hanya menggunakan shprogram, Anda juga menggunakan sejumlah utilitas . Sebagian besar utilitas manipulasi file dan pemrosesan teks di Linux adalah GNU coreutils (pada sistem embedded, biasanya dari BusyBox).

Jika Anda membutuhkan portabilitas di luar Linux, taruhan terbaik Anda adalah tetap menggunakan POSIX. Varian unix lain mungkin belum menginstal bash (bash adalah bagian dari instalasi standar pada OSX, tetapi paket opsional pada * BSD dan sebagian besar iklan komersial). Hampir semua varian unix selain Linux dan OSX (yaitu * BSD dan iklan komersial) memiliki beberapa versi shell Korn , setidaknya pdksh . Banyak ekstensi bash yang nyaman berasal dari ksh, jadi mungkin berguna untuk menulis skrip yang dapat berjalan di bawah keduanya, tetapi mendeteksi di mana bash atau ksh berada pada sistem yang tidak dikenal dapat sedikit menyebalkan.

Shell tidak bisa melakukan semuanya. Jika Anda membutuhkan bahasa yang lebih canggih, dua pilihan yang lebih umum adalah Perl dan Python (yang lainnya jauh di belakang sebagai bahasa skrip unix). Perl adalah bahasa scripting tradisional, dan beberapa sistem Linux non-embedded tidak memilikinya, tetapi Python mendapatkan dukungan (sebagian didorong dengan menjadi bahasa scripting yang disarankan untuk Ubuntu). Di dunia non-Linux, Perl adalah bagian dari instalasi dasar pada OSX dan OpenBSD; itu opsional tetapi sangat umum diinstal pada FreeBSD, dan opsional tetapi sering diinstal pada NetBSD.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
"Didorong sebagian oleh ..." Itu dan menjadi yang paling dibutuhkan dalam sistem Fedora dan RHEL.
Ignacio Vazquez-Abrams
Sebagian besar setuju dengan semua ini. Hanya beberapa penekanan yang berbeda: * beberapa distro berbasis BusyBox tetapi belum tentu tertanam (Saya menggunakan satu, Alpine). (Memang, jawabannya memang mengatakan "hampir selalu".) * BSD adalah kelas besar sistem mirip Unix di mana Anda tidak dapat mengasumsikan bash secara default. * Dash dapat melakukan hampir semua hal yang dapat dilakukan bash, terkadang hanya membutuhkan lebih banyak perhatian. * Jika Anda membutuhkan bahasa yang lebih canggih, ya Perl dan Python adalah pilihan paling umum, tetapi awk bahkan lebih di mana-mana dan memadai untuk banyak tujuan. Ini juga sering diremehkan. Tapi ini lebih ringan dari Perl dan Python.
dubiousjim
2
Peringatan yang adil - FreeBSD menjatuhkan Perl dari instal default mereka beberapa waktu lalu. Selain itu, saya tidak tahu ada distro lain yang tidak memiliki Perl di basis instalasi mereka.
TC1
@ TC1 Perl selalu opsional di NetBSD. Itu ada di sistem basis di OpenBSD.
Gilles 'SO- stop being evil'
@dubiousjim Hanya Linux (tidak tertanam, atau perkiraan yang cukup baik dalam praktiknya) dan OSX memiliki bash dalam instalasi default mereka; * BSD memiliki pdksh atau mksh, dan unit komersial memiliki ATT ksh.
Gilles 'SO- stop being evil'
11

Dalam urutan ketersediaan:

  1. sh, tetapi tetap berpegang pada fasilitas yang ditentukan POSIX.
  2. bash, tapi jangan lupa untuk secara eksplisit menentukannya di shebang atau Anda mungkin mendapatkan tanda hubung.
  3. Python. Hampir semua orang menggunakannya.
  4. Perl. Tetapi Anda harus menulisnya.

Setelah itu, tidak ada yang benar-benar peduli karena tidak banyak yang tidak dapat Anda lakukan hanya dengan mereka.

Ignacio Vazquez-Abrams
sumber
10
Saya akan meletakkan PERL sebelum python, diinstal secara default di sebagian besar sistem linux.
terdon
4
Perl adalah # 3. Dan Anda bisa menulisnya, bonus! :)
Warren Young
2
Saya setuju dengan @ignacio perl # 4 dan python # 3. Alasannya jelas. Saya pikir Python adalah evolusi perl.
bagavadhar
5
@ashwin: tidak, python bukan merupakan evolusi dari, atau bahkan seperti, perl. perl adalah bahasa oleh sysadmin untuk sysadmin. python adalah bahasa oleh programmer untuk programmer. Perbedaan itu sangat penting. Mereka berdua memiliki kegunaan mereka dan sementara ada banyak tumpang tindih dalam kasus penggunaan, untuk beberapa tugas perl adalah pilihan yang lebih baik, dan untuk yang lain python jelas lebih unggul.
cas
1
Ruby dan PHP terinspirasi oleh Perl. Python adalah hasil percobaan fisika di mana mereka menciptakan anti-Perls dalam sebuah superkolider. (Saya tidak menentang Python. Plusses dan minus, plusses dan minus.)
Warren Young
4

Biasanya, saya akan mengatakan sh.... tetapi karena Anda menentukan Linux, saya akan mengatakan bash- dijamin ada di setiap sistem Linux di sekitar (well, tidak termasuk yang pedantically-kecil yang tidak jelas yang memfitnah minimalis :).

Jika Anda tidak perlu peduli dengan portabilitas non-linux (dan jika Anda tidak perlu menjalankan distro kecil atau di perangkat Linux yang tertanam seperti router kotak plastik), maka Anda mungkin juga menggunakan perangkat tambahan signifikan yang ia menawarkan lebih dari yang biasa sh. Kalau tidak gunakan sh.

Setelah bash(dan sh), bahasa scripting yang paling "universal" berikutnya untuk Linux adalah beberapa dialek awk- biasanya salah satu mawkatau gawk. Jika Anda tetap menggunakan awk polos dan menghindari gawkisme, skrip Anda harus berjalan dengan baik di hampir semua sistem Linux (mungkin tidak ada pada distro kecil atau perangkat yang disematkan). Sebagian besar sistem Linux akan memiliki keduanya mawkdan gawktersedia, tetapi pada beberapa distro (misalnya, debian) mawkdiinstal secara default dan Anda harus menginstal gawksendiri jika Anda menginginkannya.

Berikutnya adalah perl. AFAIK, bahasa perl dasar diinstal secara default pada semua distro Linux umum, sehingga membuatnya menjadi pilihan yang baik. Bahkan lebih untungnya, ada sangat sedikit ketidakcocokan versi dengan rilis perl5 (meskipun perl 5.12 atau mungkin 5.14 akhirnya berhasil menghapus beberapa fitur tidak jelas yang telah ditinggalkan selama sekitar 15 tahun ... banyak peringatan untuk tidak menggunakannya) jadi kecuali gaya pengkodean Anda benar-benar aneh dan Anda ingin mengabaikan peringatan "jangan lakukan itu" selama satu dekade, skrip perl Anda akan berjalan dengan baik hampir di mana saja. Bahasa ini kokoh dan kuat dan dapat melakukan segala sesuatu yang awkdan seddapat melakukan dan banyak lagi. Dengan sedikit usaha ia dapat melakukan hal-hal itushsecara tradisional juga baik (misalnya menjalankan perintah eksternal dan menggunakan / memipipkan output). Pustaka perl standar juga cukup komprehensif - mencakup lebih dari sekadar dasar-dasarnya.

Satu-satunya masalah dengan perl adalah bahwa ada juga perpustakaan besar modul CPAN untuk melakukan apa saja yang dapat Anda pikirkan (dan banyak lagi yang mungkin tidak pernah terpikirkan oleh Anda) - dan tidak semuanya akan tersedia pada setiap sistem dengan perl . Mereka biasanya berkualitas sangat tinggi sehingga mudah untuk terbiasa menggunakannya - tetapi jika Anda memanfaatkannya, Anda harus memastikan bahwa itu sudah terpasang. Banyak modul CPAN yang dipra-paket untuk Linux, dan sisanya mudah diinstal dengan alat cpan (atau dh-make-perldi debian / ubuntu / etc untuk mengubah modul CPAN menjadi paket .deb)

Saya ingin bisa mengatakan pythonselanjutnya, tetapi saya benar-benar tidak bisa. Ada banyak hal yang disukai tentang python tetapi tidak disertakan secara default pada banyak sistem Linux dan, terus terang, itu kompatibilitas versi (baik untuk python itu sendiri dan lib yang katanya "standar") adalah berantakan lengkap. Beberapa distro berusaha keras untuk menyelesaikan masalah, dan beberapa tidak. Tidak ada yang terbantu oleh fakta bahwa python pada dasarnya adalah bahasa yang ditulis untuk programmer oleh programmer (berbeda dengan sysadmin) dan mereka sepertinya tidak berpikir bahwa sistem yang akan diinstal dengan kode mereka sama sekali penting .... kode mereka benar-benar super spesial sehingga mereka tidak perlu khawatir dengan hal-hal yang membosankan seperti integrasi ke dalam sistem yang ada.

(Jangan salah paham dari sarkasme saya di sini - Saya sangat suka python sebagai bahasa, saya hanya membenci kenyataan bahwa versi dan manajemen ketergantungan adalah PITA. Ini seperti kembali 20 tahun ke era perburuan secara manual untuk mengaburkan yang tidak jelas. bit kode dan tambalan untuk mendapatkan sesuatu yang dikompilasi dan dijalankan di * nix milik Anda)

cas
sumber
Saya tahu ini adalah posting lama, tetapi cara terbaik untuk menghindari ini adalah dengan menentukan versi mana di shebang (mis. /usr/bin/python2, /usr/bin/python3).
Isiah Meadows
1

Saya sarankan ikuti ksh93 atau bahkan rasa POSIX dan Anda selalu dapat menggunakan bash / zsh untuk menjalankan.

Dan distro berbasis Debian menggunakan mawk bukan gawk sebagai default awk. Jadi ya hindari penambahan gawk karena mawk jauh lebih cepat.

MEA Culpa
sumber
0

Bukan bash. Menulis ke dasbor atau abu yang dekat dengan POSIX seperti abu. Itu akan menjadi yang paling universal. Saya tidak berpikir ada hal lain yang bahkan merupakan pesaing dekat. (Dan menurut saya ini adalah pertanyaan faktual, bukan "opini" seperti yang dikeluhkan oleh salah seorang komentator.)

Jika Anda membutuhkan sesuatu yang sedikit lebih kuat daripada sh (misalnya, jika Anda ingin array asosiatif nyata), gunakan awk. (Menghindari ekstensi gawk. Ada banyak versi awk, tetapi ada inti yang sebagian besar dibagikan.) Itu harus tersedia hampir seluas seluas sh.

dubiousjim
sumber
1
awk-on-Linux adalah universal gawk; Saya tidak dapat memikirkan distro yang memiliki varian lain secara default.
Ignacio Vazquez-Abrams
5
Varian Linux manakah yang tidak mendukung bash?
Jonathan Leffler
1
Tentu saja bashdapat diinstal dan dijalankan pada (hampir) kotak Linux apa pun, tetapi banyak pengguna debian hanya akan menginstal dashdan memilih untuk tidak menginstal bash.
William Pursell
6
@WilliamPursell Paket bash diberi tag Essential on Debian (yaitu Anda harus melalui simpai untuk mencopot pemasangan, dengan banyak peringatan bahwa ini akan menghanguskan sistem Anda). Bash hampir universal pada sistem Linux yang tidak tertanam.
Gilles 'SO- stop being evil'
1
@ JonathanLeffler: Yang disematkan sebaliknya hanya boleh memiliki Busybox.
Siput mekanik
0

Saya akan mengatakan ketersediaan akan peringkat di suatu tempat dalam urutan ini:

  1. SH
  2. awk
  3. Perl (Saya belum melihat * nix tanpa itu, termasuk BSD)

Meskipun Python terdengar seperti bahasa yang baik, saya belum pernah menggunakan OS yang menyertainya dalam instalasi basis, meskipun tampaknya Ubuntu, mungkin?

Earlz
sumber
0

Saya percaya para ahli di sini telah memberikan saran bagus yang akan membantu Anda memutuskan. Kegunaan dan ketersediaan cangkang yang berbeda telah dijelaskan dengan baik di posting lain.

Pada catatan yang berbeda, jika saya adalah Anda, saya juga akan mempertimbangkan tujuan yang ingin saya capai dengan skrip. Setiap alat memiliki kelebihan dan kekurangannya sendiri. Jadi, meskipun saya sebagian besar menggunakan Python, saya tidak akan menggunakannya dalam setiap kasus.

Saya dapat memikirkan beberapa skenario dan menyebutkan beberapa alat yang berguna untuk mereka.

File FTP ke-dan-dari; memprosesnya; kirim pemberitahuan email; dan seterusnya

Dalam hal ini akan lebih baik untuk tetap menggunakan shell (misalnya, Bash) dan menggunakan berbagai utilitas (misalnya ftp,, crondan mail). Ini adalah kasus penggunaan khas di banyak perusahaan besar.

Pemrosesan teks cepat

Sekali lagi, kulitnya. Utilitas seperti grep, awk, sed, pastedan lain-lain yang sangat berguna dalam hal ini.

Membangun

Dalam domain C / C ++, alat universal untuk ini adalah make. Dunia Java lebih memilih Apache ANT.

Penempatan dan kendali jarak jauh

Entah shell atau Python. Sebagai contoh, scpdan rsync, masing-masing, akan sangat berguna dalam menyalin file atau menyinkronkan file.

Python, di sisi lain, memiliki modul yang sangat berguna bernama fabric. Ini akan berguna untuk operasi yang lebih kompleks misalnya, menyalin file, menghentikan beberapa proses, membuat server dan juga. Selain itu, Python juga menyediakan modul, pipyang dapat menyelesaikan dependensi yang ditentukan dengan mengunduh dan menginstal paket yang relevan.

(Perhatikan bahwa saran di atas tidak banyak berfokus pada fitur shell , melainkan pada berbagai utilitas yang tersedia.)

Barun
sumber
-1

Perl tidak dalam basis FreeBSD, NetBSD atau DragonflyBSD, maaf. OpenBSD memiliki Perl di instalasi basis. OS X saat ini merupakan UNIX bersertifikat dan dapat dianggap sebagai semacam varian BSD pada tingkat tertentu dan memiliki basis Perl, Python, dan Ruby.

Banyak UNIX berpemilik tidak memiliki Perl di pangkalan mereka, misalnya Solaris, AFAIK baik HP-UX atau IBM AIX juga ...

Marko V.
sumber
Pernyataan Anda tentang Solaris missing Perl salah. Perl adalah komponen inti wajib Solaris setidaknya sejak 2005 (Solaris 10).
jlliagre