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?
linux
shell
scripting
portability
Gilles 'SANGAT berhenti menjadi jahat'
sumber
sumber
sh
./bin/sh
pada sistem X atau Y ? Spesifikasi sh POSIX, spesifikasi SUSv3, SUSv4 sh, spesifikasi sh LSB? "sh" dengan sendirinya tidak berarti apa-apa.sh
, dan ketidaksesuaiansh
yang 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.Jawaban:
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/sh
jika baris pertama adalah#!/bin/sh
. Ada sistem POSIX di manash
terletak 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,pipestatus
variabel 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
sh
program, 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.
sumber
Dalam urutan ketersediaan:
Setelah itu, tidak ada yang benar-benar peduli karena tidak banyak yang tidak dapat Anda lakukan hanya dengan mereka.
sumber
Biasanya, saya akan mengatakan
sh
.... tetapi karena Anda menentukan Linux, saya akan mengatakanbash
- 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 gunakansh
.Setelah
bash
(dansh
), bahasa scripting yang paling "universal" berikutnya untuk Linux adalah beberapa dialekawk
- biasanya salah satumawk
ataugawk
. 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 keduanyamawk
dangawk
tersedia, tetapi pada beberapa distro (misalnya, debian)mawk
diinstal secara default dan Anda harus menginstalgawk
sendiri 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 yangawk
dansed
dapat melakukan dan banyak lagi. Dengan sedikit usaha ia dapat melakukan hal-hal itush
secara 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-perl
di debian / ubuntu / etc untuk mengubah modul CPAN menjadi paket .deb)Saya ingin bisa mengatakan
python
selanjutnya, 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)
sumber
/usr/bin/python2
,/usr/bin/python3
).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.
sumber
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.
sumber
bash
?bash
dapat diinstal dan dijalankan pada (hampir) kotak Linux apa pun, tetapi banyak pengguna debian hanya akan menginstaldash
dan memilih untuk tidak menginstalbash
.Saya akan mengatakan ketersediaan akan peringkat di suatu tempat dalam urutan ini:
Meskipun Python terdengar seperti bahasa yang baik, saya belum pernah menggunakan OS yang menyertainya dalam instalasi basis, meskipun tampaknya Ubuntu, mungkin?
sumber
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
,,cron
danmail
). Ini adalah kasus penggunaan khas di banyak perusahaan besar.Pemrosesan teks cepat
Sekali lagi, kulitnya. Utilitas seperti
grep
,awk
,sed
,paste
dan 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,
scp
danrsync
, 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,pip
yang 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.)
sumber
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 ...
sumber