GNU/Linux >> Belajar Linux >  >> Linux

Apa Artinya Menjadi "Kompatibel dengan sh"?

Saya telah melihat frasa "sh compatible" yang biasanya digunakan untuk merujuk pada shell. Saya tidak yakin apakah ini juga berlaku untuk program yang mungkin dijalankan dari dalam shell.

Apa artinya shell atau program lain menjadi "sh kompatibel"? Apa artinya menjadi "tidak kompatibel"?

Sunting:
Pertanyaan ini menanyakan perbedaan antara bash dan sh sangat relevan:
Perbedaan antara sh dan bash

Saya masih ingin jawaban langsung tentang apa artinya menjadi "sh kompatibel". Harapan yang masuk akal mungkin bahwa "sh kompatibel" berarti "mengimplementasikan Bahasa Perintah Shell" tetapi mengapa ada begitu banyak shell "sh kompatibel" dan mengapa mereka berbeda?

Jawaban yang Diterima:

Mengapa ada begitu banyak shell yang “kompatibel dengan sh”?

Shell Bourne pertama kali dirilis secara publik pada tahun 1979 sebagai bagian dari Unix V7. Karena hampir semua sistem mirip Unix dan Unix diturunkan dari V7 Unix — meskipun hanya secara spiritual — cangkang Bourne telah bersama kita “selamanya.”¹

Cangkang Bourne sebenarnya menggantikan cangkang sebelumnya, menamai kembali cangkang Thompson, tetapi itu terjadi begitu awal dalam sejarah Unix sehingga semuanya dilupakan hari ini. Cangkang Bourne adalah superset dari cangkang Thompson.²

Baik cangkang Bourne dan Thompson disebut sh . Shell yang ditentukan oleh POSIX juga disebut sh . Jadi, ketika seseorang mengatakan sh -kompatibel, mereka mengacu pada rangkaian cangkang ini. Jika mereka ingin lebih spesifik, mereka akan mengatakan “POSIX shell” atau “Bourne shell”.³

Shell POSIX didasarkan pada KornShell versi 1988, yang pada gilirannya dimaksudkan untuk menggantikan shell Bourne pada AT&T Unix, melompati shell BSD C dalam hal fitur.⁴ Sejauh ksh adalah nenek moyang dari POSIX shell, kebanyakan sistem Unix dan Unix-like menyertakan beberapa varian dari Korn shell saat ini. Pengecualian umumnya adalah sistem tertanam kecil, yang tidak mampu menyediakan ruang yang dibutuhkan oleh shell POSIX lengkap.

Konon, cangkang Korn — sebagai sesuatu yang berbeda dari cangkang POSIX — tidak pernah benar-benar menjadi populer di luar dunia Unix komersial. Ini karena kebangkitannya sesuai dengan tahun-tahun awal komersialisasi Unix, sehingga terjebak dalam perang Unix. Unix BSD menghindarinya dan memilih shell C, dan kode sumbernya tidak tersedia secara bebas untuk digunakan di Linux ketika dimulai.⁵ Jadi, ketika distributor Linux awal mencari shell perintah untuk digunakan dengan kernel Linux mereka, mereka biasanya memilih GNU Bash, salah satunya sh -kompatibel yang Anda bicarakan.⁶

Hubungan awal antara Linux dan Bash itu cukup menutup nasib banyak shell lainnya, termasuk ksh , csh dan tcsh . Ada orang yang masih menggunakan cangkang itu sampai sekarang, tetapi jumlahnya sangat sedikit.⁷

Semua riwayat ini menjelaskan mengapa pembuat yang relatif terlambat menyukai bash , zsh , dan yash memilih untuk menjadikannya sh -kompatibel:Kompatibilitas Bourne/POSIX adalah minimum yang harus disediakan oleh shell untuk sistem mirip Unix agar dapat diadopsi secara luas.

Di banyak sistem, shell perintah interaktif default dan /bin/sh adalah hal yang berbeda. /bin/sh mungkin:

  • Cangkang Bourne asli. Hal ini biasa terjadi pada sistem UNIX® lama, seperti Solaris 10 (dirilis tahun 2005) dan pendahulunya.⁸

  • Cangkang bersertifikasi POSIX. Hal ini biasa terjadi pada sistem UNIX® yang lebih baru, seperti Solaris 11 (2010).

  • Cangkang Almquist . Ini adalah klon shell Bourne/POSIX open source yang awalnya dirilis di Usenet pada tahun 1989, yang kemudian disumbangkan ke CSRG Berkeley untuk dimasukkan dalam rilis BSD pertama yang tidak mengandung kode sumber AT&T, 4.4BSD-Lite. Cangkang Almquist sering disebut ash , bahkan ketika diinstal sebagai /bin/sh .

    4.4BSD-Lite pada gilirannya menjadi basis untuk semua turunan BSD modern, dengan /bin/sh tetap sebagai turunan Almquist di sebagian besar dari mereka, dengan satu pengecualian utama yang tercantum di bawah ini. Anda dapat melihat turunan langsung ini di repositori kode sumber untuk NetBSD dan FreeBSD:mereka mengirimkan turunan shell Almquist sejak hari pertama.

    Ada dua ash yang penting garpu di luar dunia BSD:

    1. dash , yang terkenal diadopsi oleh Debian dan Ubuntu pada tahun 2006 sebagai default /bin/sh penerapan. (Bash tetap default interaktif shell perintah dalam turunan Debian.)

    2. ash perintah di BusyBox, yang sering digunakan di Linux tertanam dan dapat digunakan untuk mengimplementasikan /bin/sh . Karena tanggal dash dan itu berasal dari ash lama Debian paket, saya telah memilih untuk menganggapnya sebagai turunan dari dash daripada ash , terlepas dari nama perintahnya di dalam BusyBox.

      (BusyBox juga menyertakan alternatif yang kurang berfitur untuk ash disebut hush . Biasanya hanya satu dari keduanya yang akan dibangun ke dalam biner BusyBox yang diberikan:ash secara default, tetapi hush ketika ruang sangat sempit. Jadi, /bin/sh pada sistem berbasis BusyBox tidak selalu dash -suka.)

  • GNU Bash , yang menonaktifkan sebagian besar ekstensi non-POSIX saat dipanggil sebagai sh .

    Pilihan ini khas pada varian desktop dan server Linux, kecuali Debian dan turunannya. Mac OS X juga telah melakukan ini sejak Panther, dirilis pada tahun 2003.

  • Cangkang dengan ksh93 Ekstensi POSIX , seperti di OpenBSD. Meskipun shell OpenBSD mengubah perilaku untuk menghindari sintaks dan inkompatibilitas semantik dengan shell Bourne dan POSIX saat dipanggil sebagai sh , itu tidak menonaktifkan ekstensi murni apa pun, karena ekstensi yang tidak bertentangan dengan shell yang lebih lama.

    Ini tidak umum; Anda seharusnya tidak mengharapkan ksh93 fitur di /bin/sh .

Saya menggunakan "skrip shell" di atas sebagai istilah umum yang berarti skrip shell Bourne/POSIX. Ini karena cangkang keluarga Bourne ada di mana-mana. Untuk berbicara tentang skrip di shell lain, Anda perlu memberikan kualifikasi, seperti "skrip C shell." Bahkan pada sistem di mana shell keluarga C adalah shell interaktif default, lebih baik menggunakan shell Bourne untuk skrip.

Dikatakan bahwa ketika Wikipedia mengklasifikasikan shell Unix, mereka mengelompokkannya menjadi Bourne shell compatible, C shell compatible, dan “other.”

Terkait:Perintah yang mudah digunakan untuk mendaftar semua pengguna di sistem Ubuntu?

Diagram ini dapat membantu:

(Klik untuk versi SVG, 31 kB, atau lihat versi PNG ukuran penuh, 218 kB.)

Apa artinya menjadi "tidak kompatibel"?

Seseorang berbicara tentang sh -hal yang tidak kompatibel biasanya berarti salah satu dari tiga hal:

  1. Mereka mengacu pada salah satu cangkang "lainnya".⁹

  2. Mereka membuat perbedaan antara keluarga cangkang Bourne dan C.

  3. Mereka berbicara tentang beberapa fitur khusus dalam satu cangkang keluarga Bourne yang tidak ada di semua cangkang keluarga Bourne lainnya. ksh93 , bash , dan zsh khususnya memiliki banyak fitur yang tidak ada di cangkang "standar" yang lebih lama. Ketiganya juga saling tidak kompatibel dalam banyak hal, setelah Anda melampaui POSIX/ksh88 yang dibagikan dasar.

Ini adalah kesalahan klasik untuk menulis skrip shell dengan #!/bin/sh garis shebang di bagian atas tetapi menggunakan ekstensi shell Bash atau Korn di dalamnya. Sejak /bin/sh adalah salah satu shell dalam diagram keluarga Korn/POSIX di atas pada banyak sistem saat ini, skrip tersebut akan bekerja pada sistem tempat mereka menulis, tetapi kemudian gagal pada sistem di mana /bin/sh adalah sesuatu dari keluarga kerang Bourne yang lebih luas. Praktik terbaik adalah menggunakan #!/bin/bash atau #!/bin/ksh baris shebang jika skrip menggunakan ekstensi seperti itu.

Ada banyak cara untuk memeriksa apakah skrip shell keluarga Bourne portabel:

  • Jalankan checkbashisms di atasnya, alat dari proyek Debian yang memeriksa skrip untuk "bashisme".

  • Jalankan di bawah posh , shell dalam repositori paket Debian yang dengan sengaja mengimplementasikan fitur yang ditentukan oleh SUS3, ditambah beberapa fitur minor lainnya.

  • Jalankan di bawah obosh dari proyek Schily Tools, versi perbaikan dari shell Bourne sebagai open source oleh Sun sebagai bagian dari OpenSolaris pada tahun 2005, menjadikannya salah satu cara termudah untuk mendapatkan shell Bourne gaya 1979 di komputer modern.

    Distribusi Alat Schily juga menyertakan bosh , shell tipe POSIX dengan banyak fitur tidak standar, tetapi mungkin berguna untuk menguji kompatibilitas skrip shell yang dimaksudkan untuk dijalankan pada semua shell keluarga POSIX. Itu cenderung lebih konservatif dalam set fiturnya daripada bash , zsh dan versi ksh93 yang disempurnakan .

    Alat Schily juga menyertakan shell yang disebut bsh , tapi itu adalah keanehan sejarah yang sama sekali bukan cangkang keluarga Bourne.

  • Buka bab Pemrograman Shell Portabel di manual GNU Autoconf. Anda mungkin mengenali beberapa konstruksi bermasalah yang dibicarakan dalam skrip Anda.

Mengapa mereka berbeda?

Untuk alasan yang sama semua "Baru &Lebih Baik!" semuanya berbeda:

  • Versi yang ditingkatkan hanya dapat ditingkatkan dengan mematahkan kompatibilitas ke belakang.

  • Seseorang memikirkan cara lain agar sesuatu berfungsi, yang lebih mereka sukai, tetapi cara kerjanya tidak sama dengan cara lama.

  • Seseorang mencoba menerapkan kembali standar lama tanpa sepenuhnya memahaminya, sehingga mereka mengacaukannya dan menciptakan perbedaan yang tidak disengaja.

Catatan Kaki dan Tambahan :

  1. Versi awal BSD Unix hanyalah kumpulan perangkat lunak tambahan untuk V6 Unix. Karena shell Bourne tidak ditambahkan ke AT&T Unix sampai V7, BSD secara teknis tidak mulai memiliki shell Bourne. Jawaban BSD untuk sifat primitif cangkang Thompson adalah cangkang C.

    Namun demikian, versi mandiri pertama BSD (2.9BSD dan 3BSD) didasarkan pada V7 atau penerus portabelnya UNIX/32V, jadi mereka melakukannya termasuk cangkang Bourne.

    (Jalur 2BSD berubah menjadi cabang paralel BSD untuk komputer mini PDP Digital, sedangkan jalur 3BSD dan 4BSD melanjutkan untuk memanfaatkan jenis komputer yang lebih baru seperti stasiun kerja Vaxen dan Unix. 2.9BSD pada dasarnya adalah versi PDP dari 4.1cBSD; mereka adalah kontemporer, dan kode bersama. PDP tidak hilang begitu saja ketika VAX tiba, jadi jalur 2BSD masih berantakan.)

    Aman untuk mengatakan bahwa Bourne shell ada di mana-mana di dunia Unix pada tahun 1983. Itu perkiraan yang baik untuk "selamanya" di industri komputasi. MS-DOS mendapatkan sistem file hierarkis tahun itu (awww, alangkah manisnya!) dan Macintosh 24-bit pertama dengan layar 9″ B&W — bukan skala abu-abu, secara harfiah hitam dan putih — tidak akan keluar sampai awal tahun depan.

  2. Cangkang Thompson cukup primitif menurut standar saat ini. Itu hanya shell perintah interaktif, bukan lingkungan pemrograman skrip yang kita harapkan hari ini. Itu memang memiliki hal-hal seperti pipa dan pengalihan I/O, yang kami anggap sebagai bagian prototipikal dari "Shell Unix," sehingga kami menganggap shell perintah MS-DOS mendapatkannya dari Unix.

    Shell Bourne juga menggantikan shell PWB, yang menambahkan hal-hal penting ke shell Thompson seperti kemampuan program (if , switch dan while ) dan bentuk awal variabel lingkungan. Shell PWB bahkan kurang diingat dengan baik daripada shell Thompson karena bukan bagian dari setiap versi Unix.

  3. Ketika seseorang bukan spesifik tentang kompatibilitas POSIX vs Bourne shell, ada banyak hal yang bisa mereka maksudkan.

    Pada satu ekstrem, mereka bisa menggunakan cangkang Bourne 1979 sebagai garis dasar mereka. Sebuah “sh -skrip yang kompatibel” dalam pengertian ini berarti diharapkan berjalan dengan sempurna pada shell Bourne yang sebenarnya atau penerus dan klonnya:ash , bash , ksh , zsh , dll.

    Seseorang di ekstrem lain menganggap shell yang ditentukan oleh POSIX sebagai garis dasar. Kami mengambil begitu banyak fitur shell POSIX sebagai "standar" akhir-akhir ini sehingga kami sering lupa bahwa mereka sebenarnya tidak ada di shell Bourne:aritmatika bawaan, kontrol pekerjaan, riwayat perintah, alias, pengeditan baris perintah, $() bentuk substitusi perintah, dll.

  4. Meskipun cangkang Korn berakar pada awal 1980-an, AT&T tidak mengirimkannya di Unix sampai System V Release 4 pada tahun 1988. Karena begitu banyak Unix komersial didasarkan pada SVR4, ini menempatkan ksh di hampir semua Unix komersial yang relevan dari akhir 1980-an dan seterusnya.

    (Beberapa rasa Unix yang aneh berdasarkan SVR3 dan sebelumnya memegang bagian pasar setelah rilis SVR4, tetapi mereka adalah yang pertama melawan tembok ketika revolusi datang.)

    1988 juga merupakan tahun standar POSIX pertama keluar, dengan “POSIX shell” berbasis Korn shell. Kemudian, pada tahun 1993, versi perbaikan dari cangkang Korn keluar. Karena POSIX secara efektif memakukan yang asli pada tempatnya, ksh bercabang menjadi dua versi utama:ksh88 dan ksh93 , dinamai berdasarkan tahun-tahun yang terlibat dalam perpisahan mereka.

    ksh88 tidak sepenuhnya kompatibel dengan POSIX, meskipun perbedaannya kecil, sehingga beberapa versi ksh88 shell ditambal agar kompatibel dengan POSIX. (Ini dari wawancara menarik di Slashdot dengan Dr. David G. Korn. Ya, orang yang menulis cangkangnya.)

    ksh93 adalah superset dari shell POSIX yang sepenuhnya kompatibel. Pengembangan pada ksh93 telah sporadis sejak repositori sumber utama dipindahkan dari AT&T ke GitHub dengan rilis terbaru berusia sekitar 3 tahun saat saya menulis ini, ksh93v. (Nama dasar proyek tetap ksh93 dengan sufiks ditambahkan untuk menunjukkan versi rilis setelah 1993.)

    Sistem yang menyertakan cangkang Korn sebagai hal yang terpisah dari cangkang POSIX biasanya menyediakannya sebagai /bin/ksh , meskipun terkadang bersembunyi di tempat lain.

    Ketika kita berbicara tentang ksh atau kulit Korn dengan nama, kita berbicara tentang ksh93 fitur yang membedakannya dari subset shell Bourne dan POSIX yang kompatibel dengan versi sebelumnya. Anda jarang menemukan ksh88 pure murni hari ini.

  5. AT&T mempertahankan kepemilikan kode sumber shell Korn hingga Maret 2000. Pada saat itu, hubungan Linux dengan GNU Bash sangat kuat. Bash dan ksh93 masing-masing memiliki kelebihan dibandingkan yang lain, tetapi pada titik ini kelembaman membuat Linux tetap terkait erat dengan Bash.

    Mengapa vendor Linux awal paling sering memilih GNU Bash daripada pdksh , yang adalah tersedia pada saat Linux mulai, saya kira itu karena begitu banyak pengguna lainnya juga berasal dari proyek GNU. Bash juga agak lebih canggih daripada pdksh , karena pengembang Bash tidak membatasi diri untuk menyalin fitur shell Korn.

    Bekerja di pdksh berhenti sekitar saat AT&T merilis kode sumber ke cangkang Korn yang sebenarnya. Namun, ada dua garpu utama yang masih dipertahankan:OpenBSD pdksh dan MirBSD Korn Shell, mksh .

    Saya merasa menarik bahwa mksh adalah satu-satunya implementasi shell Korn yang saat ini dikemas untuk Cygwin.

  6. GNU Bash melampaui POSIX dalam banyak hal, tetapi Anda dapat memintanya untuk dijalankan dalam mode POSIX yang lebih murni.

  7. csh /tcsh biasanya merupakan shell interaktif default pada BSD Unix hingga awal 1990-an.

    Menjadi varian BSD, versi awal Mac OS X adalah dengan cara ini, melalui Mac OS X 10.2 "Jaguar". OS X mengganti shell default dari tcsh ke Bash di OS X 10.3 "Panther". Perubahan ini tidak memengaruhi sistem yang ditingkatkan dari 10.2 atau sebelumnya. Pengguna yang ada pada sistem yang dikonversi tersebut tetap mempertahankan tcsh cangkang.

    FreeBSD mengklaim masih menggunakan tcsh sebagai shell default, tetapi pada FreeBSD 10 VM yang saya miliki di sini, shell default tampaknya merupakan salah satu varian shell Almquist yang kompatibel dengan POSIX. Hal ini juga berlaku di NetBSD.

    OpenBSD menggunakan garpu pdksh sebagai shell default sebagai gantinya.

    Popularitas Linux dan OS X yang lebih tinggi membuat beberapa orang berharap FreeBSD juga akan beralih ke Bash, tetapi mereka tidak akan melakukannya dalam waktu dekat karena alasan filosofis. Mudah untuk menggantinya, jika ini mengganggu Anda.

  8. Sangat jarang menemukan sistem dengan shell vanilla Bourne yang sesungguhnya sebagai /bin/sh hari ini. Anda harus berusaha keras untuk menemukan sesuatu yang cukup dekat dengannya untuk pengujian kompatibilitas.

    Saya hanya mengetahui satu cara untuk menjalankan shell Bourne vintage 1979 yang asli di komputer modern:gunakan gambar disk Unix V7 Kuno dengan simulator SIMH PDP-11 dari Proyek Simulasi Sejarah Komputer. SIMH berjalan di hampir semua komputer modern, bukan hanya yang mirip Unix. SIMH bahkan berjalan di Android dan iOS.

    Dengan OpenSolaris, Sun membuka versi SVR4 dari shell Bourne untuk pertama kalinya. Sebelumnya, kode sumber untuk versi pasca-V7 dari shell Bourne hanya tersedia bagi mereka yang memiliki lisensi kode sumber Unix.

    Kode tersebut sekarang tersedia secara terpisah dari sisa proyek OpenSolaris yang sudah tidak berfungsi dari beberapa sumber berbeda.

    Sumber paling langsung adalah proyek cangkang Heirloom Bourne. Ini menjadi tersedia segera setelah rilis asli OpenSolaris tahun 2005. Beberapa pekerjaan portabilitas dan perbaikan bug telah dilakukan selama beberapa bulan ke depan, tetapi kemudian pengembangan proyek dihentikan.

    Jörg Schilling telah melakukan pekerjaan yang lebih baik dalam mempertahankan versi kode ini sebagai obosh dalam paket Alat Schily-nya. Lihat di atas untuk mengetahui lebih lanjut tentang ini.

    Ingatlah bahwa shell ini berasal dari rilis kode sumber 2005 berisi dukungan set karakter multi-byte, kontrol pekerjaan, fungsi shell, dan fitur lain yang tidak ada di shell Bourne 1979 yang asli.

    Salah satu cara untuk mengetahui apakah Anda menggunakan shell Bourne asli adalah dengan melihat apakah itu mendukung fitur tidak berdokumen yang ditambahkan untuk memudahkan transisi dari shell Thompson:^ sebagai alias untuk | . Artinya, perintah seperti ls ^ more akan memberikan kesalahan pada shell tipe Korn atau POSIX, tetapi akan berperilaku seperti ls | more pada cangkang Bourne yang sebenarnya.

  9. Terkadang Anda menemukan fish , scsh atau rc/es patuh, tetapi mereka bahkan lebih jarang daripada penggemar cangkang C.

    rc keluarga shell tidak umum digunakan pada sistem Unix/Linux, tetapi keluarga secara historis penting, begitulah caranya mendapatkan tempat dalam diagram di atas. rc adalah cangkang standar Plan 9 dari sistem operasi Bell Labs, semacam penerus Unix edisi ke-10, dibuat sebagai bagian dari penelitian lanjutan Bell Labs ke dalam desain sistem operasi. Ini tidak kompatibel dengan shell Bourne dan C pada tingkat pemrograman; mungkin ada pelajaran di sana.

    Varian paling aktif dari rc tampaknya yang dikelola oleh Toby Goodwin, yang didasarkan pada Unix rc kloning oleh Byron Rakitzis.

Terkait:Ekstrak file dari gambar buruh pelabuhan?
Linux
  1. Apa arti peringatan ini?

  2. Apa yang dimaksud dengan [email dilindungi] dalam skrip shell?

  3. Bagaimana jika [[ $? -ne 0 ]]; berarti dalam .ksh

  1. Apa yang dimaksud dengan #define X X?

  2. Apa artinya membunuh -3?

  3. Apa yang dilakukan % di string shell Linux?

  1. Apa Artinya “–” (tanda hubung ganda)?

  2. Apa Artinya `:-` Dalam Skrip Shell?

  3. Apa artinya \b dalam pola grep?