Saya telah melihat frasa "sh kompatibel" yang digunakan biasanya mengacu pada shell. Saya tidak yakin apakah itu juga berlaku untuk program yang mungkin dijalankan dari dalam shell.
Apa artinya shell atau program lain menjadi "kompatibel dengan sh"? 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 "kompatibel dengan sh". Sebuah harapan yang masuk akal mungkin bahwa "sh kompatibel" berarti "mengimplementasikan Bahasa Perintah Shell" tetapi lalu mengapa ada begitu banyak shell "sh kompatibel" dan mengapa mereka berbeda?
shell
compatibility
Praxeolitic
sumber
sumber
sh
). Untuk shell yang berbeda, ini mengacu pada apakah shell dapat menjalankan skrip Bourne shell atau tidak.Jawaban:
The Bourne shell pertama kali dirilis ke publik pada tahun 1979 sebagai bagian dari Unix V7 . Karena hampir semua sistem seperti Unix dan Unix diturunkan dari V7 Unix - bahkan jika hanya secara spiritual - cangkang Bourne telah bersama kita "selamanya." ¹
Cangkang Bourne benar-benar menggantikan cangkang sebelumnya, mengulang kembali cangkang Thompson , tetapi itu terjadi begitu awal dalam sejarah Unix sehingga semuanya terlupakan hari ini. Cangkang Bourne adalah superset dari cangkang Thompson .²
Kedua kulit Bourne dan Thompson disebut
sh
. The shell yang ditentukan oleh POSIX juga disebutsh
. Jadi, ketika seseorang mengatakansh
-compatible, mereka dengan tangan merujuk pada rangkaian kerang ini. Jika mereka ingin lebih spesifik, mereka akan mengatakan "POSIX shell" atau "Bourne shell." ³Cangkang POSIX didasarkan pada versi 1988 KornShell , yang pada gilirannya dimaksudkan untuk menggantikan cangkang Bourne pada AT&T Unix, melompati cangkang BSD C dalam hal fitur. ⁴ Sejauh
ksh
nenek moyang cangkang POSIX, kebanyakan Sistem Unix dan Unix like termasuk beberapa varian dari shell Korn saat ini. Pengecualian pada umumnya adalah sistem embedded kecil, yang tidak mampu membeli ruang yang dibutuhkan oleh shell POSIX lengkap.Yang mengatakan, shell Korn - sebagai hal yang berbeda dari shell POSIX - tidak pernah benar-benar menjadi populer di luar dunia komersial Unix. Ini karena kenaikannya berhubungan dengan tahun-tahun awal komersialisasi Unix, sehingga terperangkap dalam perang Unix . BSD Unix menolak untuk mendukung shell C, dan kode sumbernya tidak tersedia secara bebas untuk digunakan di Linux ketika dimulai. "Jadi, ketika distributor Linux awal mencari shell perintah untuk pergi dengan kernel Linux mereka, mereka biasanya memilih GNU Bash , salah satu dari yang
sh
kompatibel yang Anda bicarakan .⁶Hubungan awal antara Linux dan Bash itu cukup menyegel nasib banyak shell lain, termasuk
ksh
,csh
dantcsh
. Masih ada banyak yang masih menggunakan kerang-kerang itu hari ini, tetapi mereka sangat minoritas .⁷Semua sejarah ini menjelaskan mengapa pencipta pengguna akhir relatif suka
bash
,,zsh
danyash
memilih untuk membuatnyash
-kompatibel: Kompatibilitas Bourne / POSIX adalah jumlah minimum yang harus disediakan oleh shell untuk sistem yang mirip Unix untuk mendapatkan adopsi yang tersebar luas.Dalam banyak sistem, shell perintah interaktif default dan
/bin/sh
hal-hal yang berbeda./bin/sh
mungkin:Shell Bourne asli. Ini biasa terjadi pada sistem UNIX® lama, seperti Solaris 10 (dirilis pada 2005) dan pendahulunya.⁸
Cangkang bersertifikat POSIX. Ini umum di sistem UNIX® yang lebih baru, seperti Solaris 11 (2010).
The Almquist shell . Ini adalah klon shell Bourne / POSIX open source yang awalnya dirilis di Usenet pada tahun 1989 , yang kemudian berkontribusi pada CSRG Berkeley untuk dimasukkan dalam rilis BSD pertama yang tidak mengandung kode sumber AT&T, 4.4BSD-Lite . Shell 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 disebutkan di bawah ini. Anda dapat melihat penurunan langsung ini di repositori kode sumber untuk NetBSD dan FreeBSD : mereka mengirimkan turunan shell Almquist mulai hari pertama.Ada dua
ash
garpu penting di luar dunia BSD:dash
, yang terkenal diadopsi oleh Debian dan Ubuntu pada tahun 2006 sebagai/bin/sh
implementasi default . (Bash tetap menjadi shell perintah interaktif bawaan dalam turunan Debian.)The
ash
perintah di BusyBox , yang sering digunakan dalam Linuxes tertanam dan dapat digunakan untuk mengimplementasikan/bin/sh
. Karena lewat bulandash
dan itu berasal dari tua Debianash
paket , saya telah memilih untuk menganggapnya sebagai turunan daridash
daripadaash
, meskipun nama perintah dalam waktu BusyBox.(BusyBox juga menyertakan alternatif yang kurang menarik untuk
ash
dipanggilhush
. Biasanya hanya satu dari keduanya yang akan dibangun ke dalam biner BusyBox yang diberikan:ash
secara default, tetapihush
ketika ruang sangat ketat. Dengan demikian,/bin/sh
pada sistem berbasis BusyBox tidak selaludash
seperti-suka.)GNU Bash , yang menonaktifkan sebagian besar ekstensi non-POSIX ketika dipanggil sebagai
sh
.Pilihan ini tipikal untuk varian desktop dan server Linux, kecuali untuk Debian dan turunannya. Mac OS X juga telah melakukan ini sejak Panther, dirilis pada tahun 2003.
Shell dengan
ksh93
ekstensi POSIX , seperti pada OpenBSD . Meskipun shell OpenBSD mengubah perilaku untuk menghindari sintaksis dan ketidaksesuaian semantik dengan shell Bourne dan POSIX ketika dipanggilsh
, shell ini tidak menonaktifkan ekstensi murni apa pun, karena shell yang tidak bertentangan dengan shell yang lebih lama.Ini tidak umum; Anda seharusnya tidak mengharapkan
ksh93
fitur dalam/bin/sh
.Saya menggunakan "shell script" di atas sebagai istilah umum yang berarti skrip shell Bourne / POSIX. Ini disebabkan oleh keberadaan cangkang keluarga Bourne. Untuk berbicara tentang skrip pada shell lain, Anda perlu memberikan kualifikasi, seperti "skrip shell C." 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 ke dalam shell Bourne yang kompatibel, shell yang kompatibel, dan "lainnya."
Diagram ini dapat membantu:
(Klik untuk versi SVG, 31 kB, atau lihat versi PNG ukuran penuh , 218 kB.)
Seseorang berbicara tentang
sh
hal yang tidak kompatibel biasanya berarti satu dari tiga hal:Mereka merujuk pada salah satu dari kerang "lain" tersebut .⁹
Mereka membuat perbedaan antara keluarga shell Bourne dan C.
Mereka berbicara tentang beberapa fitur khusus dalam satu shell keluarga Bourne yang tidak ada pada semua shell keluarga Bourne lainnya.
ksh93
,,bash
danzsh
khususnya memiliki banyak fitur yang tidak ada di shell "standar" yang lebih lama. Ketiganya juga saling tidak kompatibel dalam banyak hal, setelah Anda melampaui POSIX /ksh88
base bersama.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. Karena/bin/sh
merupakan salah satu shell dalam diagram keluarga Korn / POSIX di atas pada banyak sistem sekarang ini, skrip seperti itu akan bekerja pada sistem yang mereka tulis, tetapi kemudian gagal pada sistem di mana/bin/sh
ada sesuatu dari keluarga shell kerang Bourne yang lebih luas. Praktik terbaik adalah dengan menggunakan#!/bin/bash
atau#!/bin/ksh
baris shebang jika skrip menggunakan ekstensi tersebut.Ada banyak cara untuk memeriksa apakah skrip shell Bourne yang diberikan itu portabel:
Jalankan
checkbashisms
di atasnya, alat dari proyek Debian yang memeriksa skrip untuk " bashisms ."Jalankan di bawah
posh
, shell di repositori paket Debian yang sengaja mengimplementasikan hanya fitur yang ditentukan oleh SUS3 , ditambah beberapa fitur kecil lainnya .Jalankan di bawah
osh
dari proyek Schily Tools , versi perbaikan dari shell Bourne yang bersumber terbuka dari Sun sebagai bagian dari OpenSolaris pada tahun 2005, menjadikannya salah satu cara termudah untuk mendapatkan shell Bourne gaya 1979 pada komputer modern.Distribusi Schily Tools juga mencakup
bosh
, shell tipe POSIX dengan banyak fitur tidak standar , tetapi yang mungkin berguna untuk menguji kompatibilitas skrip shell yang dimaksudkan untuk dijalankan pada semua shell keluarga POSIX. Ini cenderung lebih konservatif dalam set fitur daripadabash
,zsh
dan versi yang disempurnakan dariksh93
.Schily Tools juga termasuk shell yang disebut
bsh
, tetapi itu adalah keanehan historis yang sama sekali bukan shell keluarga Bourne.Pergi melalui Portabel Shell Programming bab dalam panduan GNU autoconf . Anda mungkin mengenali beberapa konstruk bermasalah yang dibicarakannya dalam skrip Anda.
Untuk alasan yang sama semua "Baru & Ditingkatkan!" segalanya berbeda:
Versi yang ditingkatkan hanya dapat ditingkatkan dengan memutus kompatibilitas ke belakang.
Seseorang memikirkan cara berbeda untuk sesuatu bekerja, yang mereka sukai lebih baik, tetapi yang tidak sama dengan cara kerja yang lama.
Seseorang mencoba menerapkan kembali standar lama tanpa sepenuhnya memahaminya, sehingga mereka mengacaukan dan menciptakan perbedaan yang tidak disengaja.
Catatan Kaki dan Asid :
Versi awal BSD Unix hanyalah koleksi perangkat lunak tambahan untuk V6 Unix. Karena shell Bourne tidak ditambahkan ke AT&T Unix hingga V7, BSD secara teknis tidak memulai memiliki shell Bourne. Jawaban BSD untuk sifat primitif dari shell Thompson adalah C shell .
Namun demikian, versi standalone pertama BSD (2.9BSD dan 3BSD) didasarkan pada V7 atau penggantinya portabel UNIX / 32V , sehingga mereka melakukan termasuk shell Bourne.
(Garis 2BSD berubah menjadi garpu paralel BSD untuk minikomputer PDP Digital , sedangkan jalur 3BSD dan 4BSD melanjutkan untuk mengambil keuntungan dari jenis komputer yang lebih baru seperti Vaxen dan Unix workstation . 2.9BSD pada dasarnya adalah versi PDP dari 4.1cBSD; mereka adalah kontemporer, dan kode bersama . PDPs tidak hilang begitu saja ketika VAX tiba, sehingga garis 2BSD ini masih terhuyung-huyung sepanjang .)
Aman untuk mengatakan bahwa kulit Bourne ada di mana-mana di dunia Unix pada tahun 1983. Itu perkiraan yang baik untuk "selamanya" di industri komputasi. MS-DOS memiliki sistem file hierarkis tahun itu (awww, how cuuute!) Dan Macintosh 24-bit pertama dengan layar B&W 9 "- bukan grayscale, secara harfiah hitam dan putih - tidak akan keluar hingga awal tahun berikutnya.
Kerang Thompson cukup primitif menurut standar saat ini. Itu hanya shell perintah interaktif, daripada lingkungan pemrograman skrip yang kita harapkan hari ini. Itu memang memiliki hal-hal seperti pipa dan I / O redirection, yang kami anggap sebagai bagian prototipe dari "shell Unix," sehingga kami berpikir tentang shell perintah MS-DOS yang mendapatkannya dari Unix.
Cangkang Bourne juga menggantikan cangkang PWB , yang menambahkan hal-hal penting ke cangkang Thompson seperti programabilitas (
if
,switch
danwhile
) dan bentuk awal dari variabel lingkungan. Shell PWB bahkan kurang diingat daripada shell Thompson karena itu bukan bagian dari setiap versi Unix.Ketika seseorang tidak spesifik tentang kompatibilitas shell POSIX vs Bourne, ada banyak hal yang bisa mereka maksudkan.
Pada satu ekstrim, mereka bisa menggunakan shell Bourne 1979 sebagai dasar mereka. Sebuah "
sh
-yang kompatibel script" dalam pengertian ini berarti diharapkan untuk berjalan dengan sempurna pada shell Bourne benar atau salah penerus dan klon:ash
,bash
,ksh
,zsh
, dllSeseorang di ekstrem yang lain menganggap shell yang ditentukan oleh POSIX sebagai baseline. Kami mengambil begitu banyak fitur shell POSIX sebagai "standar" hari ini sehingga kami sering lupa bahwa mereka tidak benar-benar hadir dalam shell Bourne: built-in aritmatika, kontrol pekerjaan, riwayat perintah, alias, pengeditan baris perintah,
$()
bentuk perintah substitusi, dll.Meskipun shell Korn berakar kembali ke awal 1980-an, AT&T tidak mengirimkannya di Unix hingga System V Release 4 pada tahun 1988. Karena begitu banyak Unix komersial didasarkan pada SVR4, ini memasukkan
ksh
hampir semua iklan Unix yang relevan dari akhir 1980-an dan seterusnya.(Beberapa rasa Unix yang aneh berdasarkan pada SVR3 dan sebelumnya memegang potongan pasar melewati rilis SVR4, tetapi mereka adalah yang pertama melawan tembok ketika revolusi datang.)
1988 juga merupakan tahun standar POSIX pertama keluar, dengan shell Korn berbasis "POSIX shell." Kemudian, pada tahun 1993, versi yang lebih baik dari shell Korn keluar. Karena POSIX secara efektif memaku yang asli di tempat,
ksh
bercabang menjadi dua versi utama:ksh88
danksh93
, dinamai setelah bertahun-tahun terlibat dalam perpecahan mereka.ksh88
tidak sepenuhnya kompatibel dengan POSIX, meskipun perbedaannya kecil, sehingga beberapa versiksh88
shell ditambal agar kompatibel dengan POSIX. (Ini dari wawancara yang menarik tentang Slashdot dengan Dr. David G. Korn . Ya, pria yang menulis shell.)ksh93
adalah superset yang sepenuhnya kompatibel dari shell POSIX . Pengembanganksh93
telah sporadis sejak repositori sumber utama pindah dari AT&T ke GitHub dengan rilis terbaru sekitar 3 tahun saat saya menulis ini, ksh93v. (Nama dasar proyek tetapksh93
dengan akhiran yang ditambahkan untuk menunjukkan versi rilis di luar tahun 1993.)Sistem yang menyertakan cangkang Korn sebagai hal yang terpisah dari cangkang POSIX biasanya menjadikannya tersedia
/bin/ksh
, meskipun terkadang bersembunyi di tempat lain.Ketika kita berbicara tentang
ksh
atau shell Korn dengan nama, kita berbicara tentangksh93
fitur yang membedakannya dari subset shell Bourne dan POSIX yang kompatibel ke belakang. Anda jarang menemukan yang murniksh88
hari ini.AT&T menyimpan kode sumber shell milik Korn hingga Maret 2000 . Pada saat itu, hubungan Linux dengan GNU Bash sangat kuat. Bash dan
ksh93
masing-masing memiliki kelebihan di atas yang lain , tetapi pada saat ini kelembaman membuat Linux terkait erat dengan Bash.Mengapa vendor Linux awal yang paling sering memilih GNU Bash lebih
pdksh
, yang adalah tersedia pada saat Linux memulai, aku rasa itu karena begitu banyak sisa userland juga datang dari proyek GNU . Bash juga agak lebih maju daripadapdksh
, karena pengembang Bash tidak membatasi diri untuk menyalin fitur shell Korn.Pekerjaan
pdksh
berhenti ketika AT&T merilis kode sumber ke shell Korn yang sebenarnya. Ada dua garpu utama yang masih dipertahankan, yaitu: OpenBSDpdksh
dan MirBSD Korn Shellmksh
,.Saya merasa menarik bahwa
mksh
adalah satu-satunya implementasi shell Korn yang saat ini dikemas untuk Cygwin.GNU Bash melampaui POSIX dalam banyak hal, tetapi Anda dapat memintanya untuk berjalan dalam mode POSIX yang lebih murni .
csh
/tcsh
Biasanya default shell interaktif BSD Unix melalui awal 1990-an.Menjadi varian BSD , versi awal Mac OS X adalah cara ini, melalui Mac OS X 10.2 "Jaguar" . OS X mengalihkan 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 menyimpantcsh
cangkang mereka .FreeBSD mengklaim masih menggunakan
tcsh
shell default , tetapi pada FreeBSD 10 VM yang saya miliki di sini, shell default tampaknya menjadi salah satu varian shell Almquist yang kompatibel dengan POSIX . Ini juga berlaku di NetBSD.OpenBSD menggunakan garpu
pdksh
sebagai shell default sebagai gantinya.Semakin populernya Linux dan OS X membuat beberapa orang berharap FreeBSD juga akan beralih ke Bash, tetapi mereka tidak akan melakukannya dalam waktu dekat karena alasan filosofis . Hal ini mudah untuk beralih , jika ini mengganggu Anda.
Sangat jarang menemukan sistem dengan cangkang Bourne vanilla yang benar-benar seperti saat
/bin/sh
ini. Anda harus keluar dari cara Anda untuk menemukan sesuatu yang cukup dekat untuk pengujian kompatibilitas.Saya mengetahui hanya satu cara untuk menjalankan shell Bourne vintage tahun 1979 yang asli pada komputer modern: gunakan gambar disk Ancient Unix V7 dengan simulator SIMH PDP-11 dari Computer History Simulation Project . SIMH berjalan di hampir setiap komputer modern , bukan hanya yang mirip Unix. SIMH bahkan berjalan di Android dan iOS .
Dengan OpenSolaris , Sun membuka versi SVR4 shell Bourne untuk pertama kalinya. Sebelum itu, kode sumber untuk versi post-V7 dari shell Bourne hanya tersedia bagi mereka yang memiliki lisensi kode sumber Unix.
Kode itu sekarang tersedia secara terpisah dari sisa proyek OpenSolaris yang sudah tidak beroperasi dari beberapa sumber yang berbeda.
Sumber paling langsung adalah proyek shell Heirloom Bourne . Ini menjadi tersedia segera setelah rilis OpenSolaris asli tahun 2005. Beberapa pekerjaan portabilitas dan perbaikan bug dilakukan selama beberapa bulan ke depan, tetapi kemudian pengembangan proyek terhenti.
Jörg Schilling telah melakukan pekerjaan yang lebih baik dalam mempertahankan versi kode ini seperti
osh
dalam paket Schily Tools-nya . Lihat di atas untuk informasi lebih lanjut tentang ini.Perlu diingat bahwa shell ini berasal dari rilis kode sumber 2005 berisi dukungan set karakter multi-byte , kontrol pekerjaan, fungsi shell , dan fitur lainnya yang tidak ada dalam shell Bourne 1979 yang asli.
Salah satu cara untuk mengetahui apakah Anda menggunakan shell Bourne asli adalah untuk melihat apakah ia mendukung fitur tidak berdokumen yang ditambahkan untuk memudahkan transisi dari shell Thompson:
^
sebagai alias untuk|
. Dengan kata lain, perintah likels ^ more
akan memberikan kesalahan pada shell tipe Korn atau POSIX, tetapi akan berperilaku sepertils | more
pada shell Bourne yang benar.Kadang-kadang Anda menemukan
fish
,scsh
ataurc/es
patuh, tetapi mereka bahkan lebih jarang daripada penggemar shell C.The
rc
keluarga kerang tidak umum digunakan pada sistem Unix / Linux, tapi keluarga secara historis penting, yang adalah bagaimana mendapatkan tempat dalam diagram di atas.rc
adalah shell standar Plan 9 dari sistem operasi Bell Labs , sejenis penerus Unix edisi 10 , yang dibuat sebagai bagian dari penelitian lanjutan Bell Labs mengenai desain sistem operasi. Ini tidak kompatibel dengan cangkang Bourne dan C pada tingkat pemrograman; mungkin ada pelajaran di sana.Varian yang paling aktif
rc
adalah yang dipelihara oleh Toby Goodwin , yang didasarkan padarc
klon Unix oleh Byron Rakitzis.sumber
"sh kompatibel" mengacu pada POSIX
sh
, shell dasar yang diperlukan untuk ada pada semua sistem yang kompatibel. Skrip yang kompatibel dengan sh harus bekerja pada mesin apa pun yang kompatibel dengan POSIX.Alasan itu perlu untuk mengatakan begitu adalah yang umum
/bin/sh
adalah sebuah symlink ke/bin/bash
, yang telah membiarkan beberapa Bashisms tergelincir ke dalam script yang menyatakan diri untuk menggunakansh
dengan#!/bin/sh
. Skrip ini gagal berfungsi pada sistem yang tidak digunakanbash
sebagai/bin/sh
, termasuk beberapa Unite komersial selamanya, dan Debian dan turunannya baru-baru ini.Secara khusus sudah ada tren untuk digunakan
dash
, Debian Almquish Shell, sebagai standarsh
akhir-akhir ini, karena lebih kecil dan dimaksudkan untuk menjadi lebih cepat. Tren itu telah menyoroti banyak Bashisme yang ada dalamsh
skrip yang seharusnya . Menggambarkan sesuatu sebagai "kompatibel dengan sh" menunjukkan bahwa itu secara eksplisit dimaksudkan untuk bekerja dengan sistem ini dengan tetap sepenuhnya dalam bahasa yang ditentukan POSIX - semua shell akan mengimplementasikan superset dari fungsionalitas itu, jadi itu dijamin untuk bekerja di mana-mana, tetapi ekstensi mereka tidak bekerja kompatibel satu sama lain.Kerang yang berbeda memiliki sejarah pengembangannya sendiri dan menyimpang ke arah yang berbeda dari waktu ke waktu, karena mereka menambahkan fungsi untuk membantu penggunaan interaktif bagi pengguna mereka, atau ekstensi skrip seperti array asosiatif. Skrip "tidak kompatibel" akan menggunakan beberapa fitur ekstensi non-standar ini, seperti
[[
persyaratan Bash .Fitur-fitur non-POSIX di
bash
dantcsh
danzsh
dan semua shell saat ini berguna , dan ada banyak kesempatan di mana Anda mungkin ingin atau membutuhkannya. Mereka seharusnya tidak digunakan dalam skrip yang menyatakan dirinya dapat digunakan/bin/sh
, karena Anda tidak dapat mengandalkan fitur-fitur yang berada dalamsh
implementasi dasar pada sistem yang Anda jalankan.Skrip yang memang perlu menggunakan, katakanlah, array asosiatif, harus memastikan dijalankan dengan
bash
alih - alihsh
:Itu akan bekerja di mana saja dengan
bash
. Skrip yang tidak memerlukan fungsionalitas yang diperluas dan dimaksudkan untuk portabel harus menyatakan bahwa mereka menggunakansh
dan tetap menggunakan bahasa perintah shell dasar.sumber