Pendahuluan: Saya suka bash dan tidak punya niat memulai segala jenis argumen atau perang suci, dan mudah-mudahan ini bukan pertanyaan yang sangat naif.
Pertanyaan ini agak terkait dengan posting ini pada pengguna super, tapi saya tidak berpikir OP benar-benar tahu apa yang dia minta. Saya menggunakan bash di FreeBSD, linux, OS X, dan cygwin di Windows. Saya juga memiliki pengalaman luas baru-baru ini dengan PowerShell di Windows.
Apakah ada shell untuk * nix, sudah tersedia atau dalam karya-karya, yang kompatibel dengan bash tetapi menambahkan lapisan skrip berorientasi objek ke dalam campuran? Satu-satunya hal yang saya tahu yang mendekati adalah konsol python, tetapi sejauh yang saya tahu itu tidak memberikan akses ke lingkungan shell standar. Misalnya, saya tidak bisa adil cd ~
dan ls
, kemudian chmod +x file
di dalam konsol python. Saya harus menggunakan python untuk melakukan tugas-tugas itu daripada binari unix standar, atau memanggil binari menggunakan kode python.
Apakah shell semacam itu ada?
sumber
cd ~
diikuti olehls
karya seperti di Bash. Anda juga dapat menetapkan output ke variabel Python (daftar baris.. Semacam) dengan perintah sepertilisting = !ls
.Jawaban:
Saya dapat memikirkan tiga fitur yang diinginkan dalam sebuah shell:
Kerang Unix cenderung berkonsentrasi pada aspek interaktif dan mensubkontrakkan sebagian besar akses sistem dan beberapa pemrograman ke alat eksternal, seperti:
ftp
untuk FTPmail
,Mail
,mailx
, Dll untuk e-mail dasarcron
untuk tugas yang dijadwalkandbus-*
atau qdbus ) untuk berbagai informasi sistem dan tugas konfigurasi (termasuk lingkungan desktop modern seperti KDE ≥4)Banyak, banyak hal dapat dilakukan dengan menjalankan perintah dengan argumen yang benar atau input yang disalurkan. Ini adalah pendekatan yang sangat kuat - lebih baik memiliki satu alat per tugas yang melakukannya dengan baik, daripada satu program yang melakukan semuanya dengan sangat buruk - tetapi ia memiliki keterbatasan.
Keterbatasan utama shell unix, dan saya menduga inilah yang Anda cari dengan persyaratan "scripting berorientasi objek" Anda, adalah bahwa mereka tidak pandai menyimpan informasi dari satu perintah ke perintah berikutnya, atau menggabungkan perintah dengan cara yang lebih bagus daripada sebuah pipa. Secara khusus, komunikasi antar-program berbasiskan teks, sehingga aplikasi hanya dapat digabungkan jika mem-serialkan datanya dengan cara yang kompatibel. Ini adalah berkah sekaligus kutukan: pendekatan segalanya-teks-membuatnya mudah untuk menyelesaikan tugas-tugas sederhana dengan cepat, tetapi meningkatkan penghalang untuk tugas-tugas yang lebih kompleks.
Kegunaan interaktif juga berjalan agak terhadap pemeliharaan program. Program interaktif harus pendek, membutuhkan sedikit penawaran, tidak mengganggu Anda dengan deklarasi variabel atau mengetik, dll. Program yang dapat dipertahankan harus dapat dibaca (jadi tidak memiliki banyak singkatan), harus dapat dibaca (sehingga Anda tidak perlu bertanya-tanya apakah kata yang telanjang) adalah string, nama fungsi, nama variabel, dll.), harus memiliki pemeriksaan konsistensi seperti deklarasi variabel dan pengetikan, dll.
Singkatnya, shell adalah kompromi yang sulit untuk dicapai. Ok, ini mengakhiri bagian kata-kata kasar, ke contoh.
The Perl Shell (psh) “menggabungkan sifat interaktif dari Unix shell dengan kekuatan Perl”. Perintah sederhana (bahkan jaringan pipa) dapat dimasukkan dalam sintaks shell; yang lainnya adalah Perl. Proyek ini sudah lama tidak dikembangkan. Ini dapat digunakan, tetapi belum mencapai titik di mana saya akan mempertimbangkan menggunakannya di atas Perl murni (untuk skrip) atau shell murni (secara interaktif atau untuk skrip).
IPython adalah konsol Python interaktif yang ditingkatkan, terutama ditargetkan pada komputasi numerik dan paralel. Ini adalah proyek yang relatif muda.
irb (ruby interaktif) adalah setara dengan Ruby dari konsol Python.
scsh adalah implementasi skema (yaitu bahasa pemrograman yang layak) dengan jenis binding sistem yang secara tradisional ditemukan di shell unix (string, proses, file). Itu tidak bertujuan untuk dapat digunakan sebagai shell interaktif.
zsh adalah shell interaktif yang ditingkatkan. Intinya adalah interaktivitas (edisi baris perintah, penyelesaian, tugas-tugas umum diselesaikan dengan sintaks singkat tetapi samar). Fitur pemrogramannya tidak begitu bagus (setara dengan ksh), tetapi ia hadir dengan sejumlah perpustakaan untuk kontrol terminal, regexps, jaringan, dll.
ikan adalah awal yang bersih di shell unix-style. Tidak memiliki fitur pemrograman atau akses sistem yang lebih baik. Karena itu merusak kompatibilitas dengan sh, ia memiliki lebih banyak ruang untuk mengembangkan fitur yang lebih baik, tetapi itu belum terjadi.
Tambahan: bagian lain dari kotak alat unix memperlakukan banyak hal sebagai file:
/sys
menyediakan lebih banyak perangkat keras dan kontrol sistem./proc
file.Mungkin masa depan shell unix bukanlah akses sistem yang lebih baik melalui perintah (dan struktur kontrol yang lebih baik untuk menggabungkan perintah) tetapi akses sistem yang lebih baik melalui sistem file (yang menggabungkan agak berbeda - saya tidak berpikir kami telah mengerjakan apa yang idiom kunci (seperti pipa shell) belum).
sumber
Anda tidak perlu banyak kode bash untuk mengimplementasikan kelas atau objek di bash.
Katakanlah, 100 baris.
Bash memiliki array asosiatif yang dapat digunakan untuk mengimplementasikan sistem objek sederhana dengan pewarisan, metode, dan properti.
Jadi, Anda mungkin mendefinisikan kelas seperti ini:
Membuat instance dari Antrian ini dapat dilakukan seperti ini:
atau
Karena kelas diimplementasikan dengan sebuah array, kelas dan inst benar-benar sinonim - semacam seperti di javascript.
Menambahkan item ke antrian ini dapat dilakukan seperti ini:
Menghapus item ke dalam variabel X dapat dilakukan seperti ini:
Dan struktur dumping suatu objek dapat dilakukan seperti ini:
Yang akan mengembalikan sesuatu seperti ini:
Kelas dibuat menggunakan fungsi kelas seperti ini:
CATATAN: Saat mendefinisikan kelas atau instance baru, Anda dapat mengesampingkan nilai atau fungsi anggota apa pun.
Array asosiatif Bash memiliki kekhasan yang membuat pekerjaan ini rapi: $ Q [0]} identik dengan $ Q. Ini berarti bahwa kita dapat menggunakan nama array untuk memanggil fungsi pengiriman metode:
Sisi buruknya adalah saya tidak dapat menggunakan [0] untuk data sehingga antrian saya (dalam hal ini) mulai dari indeks = 1. Atau saya bisa menggunakan indeks asosiatif seperti "q + 0".
Untuk mendapatkan dan mengatur anggota Anda dapat melakukan sesuatu seperti ini:
Dan untuk membuang struktur objek, saya membuat ini:
CATATAN: Ini tidak diperlukan untuk OOP dalam bash, tetapi menyenangkan untuk melihat bagaimana objek dibuat.
Desain OOP saya belum mempertimbangkan objek di dalam objek - kecuali kelas bawaan. Anda bisa membuatnya secara terpisah, atau membuat konstruktor khusus seperti kelas (). * obj_dump * perlu dimodifikasi untuk mendeteksi kelas internal untuk mencetaknya secara rekursif.
Oh! dan saya secara manual mendefinisikan kelas ROOT untuk menyederhanakan fungsi kelas :
Dengan beberapa fungsi antrian, saya mendefinisikan beberapa kelas seperti ini:
Membuat beberapa contoh Antrian dan membuatnya berfungsi:
sumber
bash
. Mengingatkan saya pada jawaban Stephane tentang mengapa tidak menggunakan loop shell untuk memproses teks, khususnya bagian yang mengarah "secara konseptual" yang merinci perbedaan tujuan antara bahasa seperti C danbash
. unix.stackexchange.com/a/169765/135943ksh93t + memperkenalkan beberapa konsep OO sambil mempertahankan sintaksis bourne / posix shell: http://blog.fpmurphy.com/2010/05/ksh93-menggunakan-tipe-untuk-membuat-objek-berorientasi-skripsi.html
sumber
IPython secara mengejutkan nyaman digunakan.
Fitur-fitur standar shell: kontrol pekerjaan, pengeditan dan riwayat readline, alias,
cat
ls
cd
danpwd
, integrasi pager, menjalankan perintah sistem apa pun dengan mengawalinya dengan!
atau mengaktifkan%rehashx
, output perintah dapat diberikan ke variabel python, nilai-nilai python tersedia sebagai variabel shell.Khusus python: menggunakan kembali hasil dari perintah terakhir, akses cepat ke dokumentasi dan sumber, pemuatan modul, debugger. Beberapa dukungan cluster jika Anda suka itu.
Yang mengatakan, menjalankan pipa kompleks tidak dilakukan dengan Python; Anda akan menggunakan shell posix juga, hanya dengan beberapa lem untuk meneruskan nilai ke sana kemari.
sumber
Ada Rush yang menggunakan ruby dan Psh yang didasarkan pada perl.
sumber
jq
bekerja sangat baik seperti semacam lapisan berorientasi objek.sumber
Yang ini sedikit lebih mudah digunakan dan diatur, bernama args, dll. Https://github.com/uudruid74/bashTheObjects
Saya memperbarui jawaban saya dengan contoh, yang mengikuti salah satu contoh dasar yang diberikan untuk jawaban lain, tetapi dengan sintaks ini. Contoh programnya mirip, tetapi Anda tidak harus mengawali semua variabel dengan nama kelas (ia tahu ini seperti yang ditunjukkan oleh metode kindof ) dan saya pikir sintaksnya jauh lebih sederhana!
Pertama, file kelas. Default untuk variabel instan adalah opsional dan hanya digunakan jika Anda tidak meneruskan nilai-nilai ini ke konstruktor.
Sekarang sebagai contoh penggunaan:
CATATAN:
Pernyataan impor secara teknis tidak diperlukan, tetapi memaksa pemuatan kelas pada titik yang diberikan alih-alih menunggu yang baru , yang dapat membantu menginisialisasi hal-hal dalam urutan yang tepat. Catat kemudahan di mana Anda dapat mengatur beberapa variabel instan sekaligus.
Ada juga level debug, konstruktor, destruktor, subclassing , dan sistem refleksi dasar , dan yang ditampilkan adalah print / println untuk mengganti echo (pernah mencoba mencetak variabel yang dimulai dengan tanda hubung?). Contoh pada github menunjukkan itu berjalan sebagai CGI menghasilkan HTML dari kelas.
Perpustakaan itu sendiri (oop.lib.sh) tidak sesederhana itu (400+ baris, 11K), tetapi Anda cukup memasukkannya dan melupakannya.
sumber
Anda dapat menginstal PowerShell Core Edition di Linux sekarang. Ini berjalan pada platform .NET Core framework yang aktif dikembangkan oleh Microsoft.
sumber
Jika seseorang hanya menginginkan dasar-dasar pemrograman berorientasi objek (properti dan metode) daripada kerangka kerja yang sangat sederhana akan melakukan trik.
Katakanlah Anda ingin menampilkan teks "Hello World" menggunakan objek. Pertama, Anda membuat kelas objek yang memiliki properti untuk teks yang akan ditampilkan dan memiliki beberapa metode untuk mengatur teks ini dan menampilkannya. Untuk menunjukkan bagaimana beberapa instance kelas dapat bekerja bersama, saya telah menambahkan dua metode untuk menampilkan teks: satu dengan NewLine di akhir dan satu tanpa itu.
File definisi kelas: EchoClass.class
Harap perhatikan kata "<<InstanceName>>". Ini akan diganti nanti untuk membuat beberapa instance objek kelas. Sebelum Anda dapat menggunakan instance objek, Anda memerlukan fungsi yang sebenarnya membuatnya. Untuk menjaga hal-hal sederhana itu akan menjadi skrip terpisah yang disebut: ObjectFramework.lib
Jadi sekarang kita memiliki file definisi kelas dan fungsi CreateObject yang membuat salinan file ini dengan teks "<<InstanceName>>" diganti dengan nama apa pun yang kita inginkan.
Mari kita gunakan objek baru kita dalam skrip bernama: HelloWorld.sh (harap dicatat bahwa HelloWorld.sh harus dapat dieksekusi. Dua file lainnya tidak perlu)
Dengan menjalankan skrip HelloWorld.sh, ia menampilkan teks "Hello World" (dan menambahkan NewLine). Tidak ada yang akan terkesan banyak dengan hasil ini, namun kita akan tahu ini tidak sesederhana kelihatannya :)
Selamat coding!
sumber
Ini adalah shell berorientasi objek yang berbasis di Python, tetapi memiliki sintakse tutup Golang: https://github.com/alexst07/shell-plus-plus
Misalnya, coba tangkap:
kelas dan kelebihan operator:
dan Anda dapat menggunakan perintah bash serupa:
sumber
Sekarang, dengan benda apa yang Anda hadapi sebagian besar waktu? Ini file / direktori, proses dan interaksinya. Jadi harus suka
f1.edit
atau semacamnyacurrentFile=f1.c ; .edit ; .compile ; .run
. Ataud1.search(filename='*.c' string='int \*')
. Ataup1.stop
,p1.bg
. Itulah pemahaman saya tentang ooshell.sumber
baru saja mencoba memperkenalkan konsep oo ke bash berdasarkan referensi http://hipersayanx.blogspot.in/2012/12/object-oriented-programming-in-bash.html
sumber
Maaf untuk jawaban singkat tapi ini dia.
hipersayanx telah membuat artikel Pemrograman Berorientasi Objek di Bash . Pada dasarnya ia dibajak
$FUNCNAME
,function
,compgen
, danexport
untuk membuat sebagai dekat dengan OOP satu bisa mendapatkan di bash.Bagian yang keren adalah ini bekerja dengan baik dan seseorang hanya perlu beberapa baris boilerplating untuk membangun kelas.
Bagian dasar yang dibutuhkan adalah:
Pemakaian:
Sekarang, saya telah menggunakan ini sendiri dalam proyek AuditOps saya dan hipersayanx memiliki rincian lebih lanjut tentang bagaimana ini sebenarnya bekerja di situsnya. Peringatan tarif meskipun ini sangat bashism tidak akan bekerja dengan apa pun yang lebih tua dari bash 4.0 dan dapat menyebabkan sakit kepala dalam debugging. Sementara secara pribadi saya ingin melihat sebagian besar dari pelapisan ketel redone sebagai kelas itu sendiri.
Itu selalu lebih bijaksana untuk menggunakan bahasa scripting OOP yang serius seperti perl, ruby, dan python ketika lebih cocok untuk proyek Anda. Namun dalam pilihan jujur saya nilainya waktu dan usaha ketika mempertahankan skrip bash modular untuk memanfaatkan metode OOP ini di bash.
sumber
Saya sedang mengembangkan di GitHub sebuah fungsi yang berfungsi seperti Objek HashMap , shell_map .
Untuk membuat " instance HashMap " fungsi ini dapat membuat salinan dirinya sendiri dengan nama yang berbeda. Setiap salinan fungsi baru akan memiliki variabel $ FUNCNAME yang berbeda. $ FUNCNAME kemudian digunakan untuk membuat namespace untuk setiap instance Map.
Kunci peta adalah variabel global, dalam bentuk $ FUNCNAME_DATA_ $ KEY, di mana $ KEY adalah kunci yang ditambahkan ke Peta. Variabel-variabel ini adalah variabel dinamis .
Di bawah ini saya akan meletakkan versi yang disederhanakan sehingga Anda dapat menggunakan sebagai contoh.
Pemakaian:
sumber
carp "Some error message"; return
.[ -z "$KEY" ] && { carp "some message"; return;}
Tidak perlu subkulit. Tetapi sebenarnya itu tampak seperti kandidat yang sebenarnya untuk sebuahif ... elif ... elif ... else ... fi
konstruksi — yang seringkali bukan pilihan terbaik, tetapi mungkin di sini. :) (Atau mungkin saklar kasus.)Timah hitam adalah bahasa shell mirip-Python. Ini memaketkan shell seperti sintaksis dengan Python yang membuat pengalaman berorientasi objek.
sumber