it-swarm-id.com

Bash atau KornShell (ksh)?

Saya bukan orang baru di * nix, namun belakangan ini saya menghabiskan banyak waktu di Prompt. Pertanyaan saya adalah apa kelebihan menggunakan KornShell (ksh) atau Bash Shell? Di mana perangkap menggunakan salah satu dari yang lain?

Mencari untuk memahami dari sudut pandang pengguna, bukan murni skrip.

59
user13158

Pesta.

Berbagai implementasi UNIX dan Linux memiliki berbagai implementasi tingkat sumber yang berbeda dari ksh, beberapa di antaranya adalah ksh asli, beberapa di antaranya adalah implementasi pdksh dan beberapa di antaranya hanya merupakan tautan ke Shell lain yang memiliki kepribadian "ksh". Ini dapat menyebabkan perbedaan aneh dalam perilaku eksekusi.

Setidaknya dengan bash Anda dapat yakin bahwa itu adalah basis kode tunggal, dan yang perlu Anda khawatirkan adalah versi bash yang diinstal (biasanya minimum). Setelah melakukan banyak scripting pada hampir setiap UNIX modern (dan tidak terlalu modern), pemrograman untuk bash lebih konsisten dan konsisten dalam pengalaman saya.

46
j.e.hahn

Perbedaan antara Kornshell dan Bash sangat minim. Ada beberapa keunggulan yang dimiliki seseorang daripada yang lain, tetapi perbedaannya kecil:

  • BASH jauh lebih mudah untuk mengatur Prompt yang menampilkan direktori saat ini. Untuk melakukan hal yang sama di Kornshell adalah peretasan.
  • Kornshell memiliki array asosiatif dan BASH tidak. Sekarang, terakhir kali saya menggunakan array asosiatif adalah ... Biarkan saya berpikir ... Tidak pernah.
  • Kornshell menangani sintaks loop sedikit lebih baik. Anda biasanya dapat menetapkan nilai dalam loop Kornshell dan memilikinya tersedia setelah loop.
  • Bash menangani mendapatkan kode keluar dari pipa dengan cara yang lebih bersih.
  • Kornshell memiliki perintah print yang jauh lebih baik daripada perintah echo.
  • Bash memiliki penyelesaian tab. Dalam versi yang lebih lama
  • Kornshell memiliki perintah sejarah r yang memungkinkan saya untuk dengan cepat menjalankan kembali perintah yang lebih lama.
  • Kornshell memiliki sintaks cd old new yang menggantikan old dengan new di direktori dan CD Anda di sana. Lebih nyaman bila Anda berada di direktori bernama /foo/bar/barfoo/one/bar/bar/foo/bar dan Anda perlu melakukan cd ke /foo/bar/barfoo/two/bar/bar/foo/bar Di Kornshell, Anda bisa melakukan cd one two dan selesai dengan itu. Di BASH, Anda harus cd ../../../../../two/bar/bar/foo/bar.

Saya seorang lelaki tua Kornshell karena saya belajar Unix pada 1990-an, dan itu adalah Shell pilihan saat itu. Saya dapat menggunakan Bash, tetapi saya kadang-kadang merasa frustrasi karenanya karena dalam kebiasaan saya menggunakan beberapa fitur minor yang Kornshell miliki, BASH tidak berfungsi dan tidak berfungsi. Jadi, jika memungkinkan, saya menetapkan Kornshell sebagai default saya.

Namun, saya akan memberitahu Anda untuk belajar BASH. Bash sekarang diimplementasikan pada sebagian besar sistem Unix dan juga di Linux, dan ada lebih banyak sumber daya yang tersedia untuk mempelajari BASH dan mendapatkan bantuan daripada Kornshell. Jika Anda perlu melakukan sesuatu yang eksotis di BASH, Anda bisa menggunakan Stackoverflow, memposting pertanyaan Anda, dan Anda akan mendapatkan selusin jawaban dalam beberapa menit - dan beberapa di antaranya bahkan akan benar !.

Jika Anda memiliki pertanyaan Kornshell dan mempostingnya di Stackoverflow, Anda harus menunggu beberapa lama melewati peretas utama mereka seperti saya bangun dari tidur siang sebelum Anda mendapatkan jawaban. Dan, lupakan mendapat tanggapan jika mereka melayani puding di rumah hari tua hari itu.

BASH hanyalah Shell pilihan sekarang, jadi jika Anda harus mempelajari sesuatu, mungkin sebaiknya ikuti yang populer.

122
David W.

Saya seorang veteran Shell, jadi ketahuilah bahwa saya berbicara dari sudut pandang itu.

Namun, saya merasa nyaman dengan Bourne Shell, ksh88, dan ksh93, dan untuk sebagian besar saya tahu fitur mana yang didukung. (Saya harus melewatkan ksh88 di sini, karena tidak didistribusikan secara luas lagi.)

Untuk penggunaan interaktif, ambil apa pun yang sesuai dengan kebutuhan Anda. Percobaan. Saya suka bisa menggunakan Shell yang sama untuk penggunaan interaktif dan untuk pemrograman.

Saya beralih dari ksh88 pada SVR2 ke tcsh, ke ksh88Sun (yang menambahkan dukungan internasionalisasi yang signifikan) dan ksh93. Saya mencoba bash, dan membencinya karena itu meratakan sejarah saya. Kemudian saya menemukan shopt -s lithist dan semuanya baik-baik saja. (Opsi lithist memastikan bahwa baris baru dipertahankan dalam riwayat perintah Anda.)

Untuk pemrograman Shell, saya sangat merekomendasikan ksh93 jika Anda ingin bahasa pemrograman yang konsisten, kesesuaian POSIX yang baik, dan kinerja yang baik, karena banyak perintah unix umum dapat tersedia sebagai fungsi bawaan.

Jika Anda ingin portabilitas gunakan setidaknya keduanya. Dan pastikan Anda memiliki test suite yang bagus.

Ada banyak perbedaan halus antara cangkang. Pertimbangkan misalnya membaca dari sebuah pipa:

b=42 && echo one two three four |
    read a b junk && echo $b

Ini akan menghasilkan hasil yang berbeda dalam cangkang yang berbeda. Korn-Shell menjalankan pipa dari belakang ke depan; elemen terakhir dalam pipa berjalan dalam proses saat ini. Bash tidak mendukung perilaku bermanfaat ini hingga v4.x, dan bahkan kemudian, itu bukan default.

Contoh lain yang menggambarkan konsistensi: Perintah echo itu sendiri, yang dibuat usang oleh pemisahan antara BSD dan SYSV unix, dan masing-masing memperkenalkan konvensi mereka sendiri untuk tidak mencetak baris baru (dan perilaku lainnya). Hasil ini masih dapat dilihat di banyak skrip 'configure'.

Ksh mengambil pendekatan radikal untuk itu - dan memperkenalkan perintah print, yang sebenarnya mendukung kedua metode (the -n opsi dari BSD, dan trailing \c karakter khusus dari SYSV)

Namun, untuk pemrograman sistem yang serius, saya akan merekomendasikan sesuatu selain Shell, seperti python, Perl. Atau selangkah lebih maju, dan gunakan platform seperti boneka - yang memungkinkan Anda untuk menonton dan memperbaiki keadaan seluruh kelompok sistem, dengan audit yang baik.

Pemrograman shell seperti berenang di perairan yang belum dipetakan, atau lebih buruk.

Pemrograman dalam bahasa apa pun membutuhkan keakraban dengan sintaksnya, antarmuka dan perilakunya. Pemrograman shell tidak berbeda.

28
Henk Langeveld

Ini adalah sedikit pertarungan Unix vs Linux. Kebanyakan jika tidak semua distribusi Linux memiliki bash yang diinstal dan ksh opsional. Sebagian besar sistem Unix, seperti Solaris, AIX dan HPUX memiliki ksh sebagai default.

Secara pribadi saya selalu menggunakan ksh, saya suka penyelesaiannya dan saya cukup banyak menggunakan Solaris untuk semuanya.

4
Kristian

Untuk skrip, saya selalu menggunakan ksh karena lebih lancar gotchas .

Tapi saya menemukan bash lebih nyaman untuk penggunaan interaktif. Bagi saya, emacs binding kunci dan penyelesaian tab adalah manfaat utama. Tapi itu kebanyakan kekuatan kebiasaan, bukan masalah teknis dengan ksh .

4
Jon Ericson

Saya tidak memiliki pengalaman dengan ksh, tetapi saya telah menggunakan bash dan zsh. Saya lebih suka zsh daripada bash karena dukungannya untuk penggumpalan file yang sangat kuat, pengubah ekspansi variabel, dan penyelesaian tab yang lebih cepat.

Inilah intro cepat: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

Jawaban saya adalah 'pilih satu dan pelajari cara menggunakannya'. Keduanya cangkang yang layak; bash mungkin memiliki lebih banyak lonceng dan peluit, tetapi keduanya memiliki fitur dasar yang Anda inginkan. bash lebih banyak tersedia secara universal saat ini. Jika Anda menggunakan Linux sepanjang waktu, tetaplah menggunakannya.

Jika Anda pemrograman, mencoba untuk tetap berpegang pada 'sh' untuk portabilitas adalah praktik yang baik, tetapi kemudian dengan bash tersedia begitu luas hari ini sehingga sedikit saran mungkin agak kuno.

Pelajari cara menggunakan penyelesaian dan riwayat Shell Anda; bacalah halaman manual sesekali dan coba pelajari beberapa hal baru.

3
Incident

@foxxtrot

Sebenarnya, Shell standar adalah Bourne Shell (sh). /bin/sh di Linux sebenarnya bash, tetapi jika Anda bertujuan untuk skrip lintas platform, Anda lebih baik tetap menggunakan fitur-fitur dari Bourne Shell asli atau menulisnya di sesuatu seperti Perl .

3
Hank Gay

Untuk satu hal, bash memiliki penyelesaian tab. Ini saja sudah cukup untuk membuat saya lebih suka daripada ksh.

Z Shell memiliki kombinasi yang baik dari fitur unik ksh dengan hal-hal baik yang disediakan oleh bash, ditambah lebih banyak barang di atasnya.

2
Allen

Tersedia di sebagian besar sistem UNIX, ksh adalah standar-standar, dirancang dengan jelas, menyeluruh. Saya pikir buku, membantu dalam ksh sudah cukup dan jelas, terutama buku O'Reilly. Bash adalah massa. Saya menyimpannya sebagai login root Shell untuk Linux di rumah saja.

Untuk penggunaan interaktif, saya lebih suka zsh di Linux/UNIX. Saya menjalankan skrip di zsh, tetapi saya akan menguji sebagian besar skrip saya, fungsi di AIX ksh.

2
MeaCulpa