Mengapa tidak ada yang menggunakan shell Bourne yang sebenarnya sebagai / bin / sh?

55

Saya perhatikan bahwa pada dasarnya tidak ada sistem yang pernah saya gunakan yang /bin/shbisa dieksekusi. Itu selalu merupakan symlink ke dash, bashdalam mode POSIX, atau yang serupa.

Mengapa? Apa kerugian menggunakan yang asli, asli /bin/sh? (Kecepatan? Lisensi?)

strugee
sumber
3
Anda hanya pernah menggunakan Linux, kan? Saya hanya pernah melihat "sh as symlink" di Linux.
Greg Hewgill
@GregHewgill Tidakkah versi terbaru dari Solaris telah shdikaitkan ksh?
Gilles 'SO- stop being evil'
1
@Gilles menurut salah satu jawaban, ya, sejak Solaris 11. terhubung dengan ksh.
strugee
1
@GregHewgill Saya juga menggunakan Darwin, yang dikaitkan dengan bash, IIRC.
strugee
6
Apa yang Anda maksud dengan / bin / sh asli ? Cangkang Thomson dari Unix V1? Shell Bourne dari Unix V7 yang tidak memiliki fungsi bukan komentar ...? Yang ada di SysIII, SysV, Solaris, HP / UX, implementasi ulang abu pada BSD? Saat shini didasarkan pada standar yang berarti kita dapat memiliki beberapa implementasi yang akan berperilaku dengan cara yang jelas selama Anda menggunakan sintaks standar dalam skrip Anda.
Stéphane Chazelas

Jawaban:

38

Saya kira kekurangan fitur - tidak ada riwayat perintah, tidak ada pengalihan mewah, tidak ada pengeditan baris perintah. BSD memperkenalkan cshshell C karena alasan itu. Faktor lain adalah bahwa Genuine Bourne Shell baru-baru ini tersedia dalam bentuk open source . Kecuali Anda melisensikannya, Anda tidak dapat mendistribusikannya. Itu membuatnya jauh dari jangkauan untuk distro bebas biaya, dan membuatnya secara ideologis tidak menyenangkan untuk distro lain, dan * BSD.

Tetapi kodenya tersedia sekarang. Anda dapat melihatnya, mengompilasinya, memutarnya.

Bruce Ediger
sumber
50
Dan kemudian segera kembali ke apa pun yang Anda gunakan sebelumnya.
Ignacio Vazquez-Abrams
24
@ strugee "" kekurangan fitur "- mengapa ini menjadi masalah?" Ya, bagus ... mengapa programmer menggunakan hal-hal yang tidak berguna seperti assembly / C / bahasa tingkat tinggi ketika apa pun yang dapat Anda lakukan dengan mereka, Anda sudah dapat melakukan penulisan bahasa mesin secara langsung? Faktanya adalah: fitur = peningkatan kecepatan pengembangan + peningkatan pemeliharaan = biaya lebih rendah = lebih baik Penggunaannya shpersis seperti menggunakan bashkecuali bahwa itu adalah: lebih lambat, program lebih lama dan lebih sulit untuk dipertahankan.
Bakuriu
10
Ini sebenarnya bukan kekurangan fitur tetapi faktanya POSIX mengamanatkan shperintah untuk menjalankan shell yang sesuai dengan POSIX, apa yang tidak dimiliki shell Bourne legacy. Walaupun POSIX tidak perlu shberada di /bin/shdalamnya, itu adalah direktori yang paling logis.
jlliagre
4
@Bakuriu command history dan pengeditan baris perintah adalah dua hal yang tidak Anda perlukan untuk sebuah skrip.
strugee
4
@ Strugee Itu bukan satu - satunya perbedaan. Misalnya shtidak memiliki ekspansi tilde dan brace, beberapa built-in hilang (misalnya pushddan popd, select) tidak ada ekspansi aritmatika. Banyak variabel yang hilang, misalnya PIPESTATUS.
Bakuriu
23

Pernyataan dalam pertanyaan Anda salah. Solaris sampai versi 10 adalah menyediakan warisan sejati Bourne shell sebagai /bin/sh. Ini dilakukan untuk tidak merusak kompatibilitas dengan skrip lama yang mungkin gagal dengan shell yang berbeda. Namun pilihan ini sangat membuat frustasi.

Kebanyakan jika tidak semua Unix dan Unix seperti rilis, termasuk Solaris 11, menyediakan shell yang kompatibel dengan /bin/shPOSIX karena POSIX mengamanatkan shperintah untuk meluncurkan shell POSIX, bukan shell Bourne yang tidak sesuai. /bin/shumumnya:

  • ksh88atau ksh93pada implementasi Unix komersial
  • dimodifikasi bashpada OS/X(meskipun dulu zsh)
  • suatu ashatau pdkshturunan dari yang lainBSDs
  • bashatau dashpada distribusi Gnu / Linux.

Ini tidak harus berupa tautan tetapi dapat menjadi nyata yang dapat dieksekusi pada banyak sistem selain Gnu / Linux.

Menariknya, terlepas dari apa yang menyatakan jawaban paling terunggulkan untuk pertanyaan Anda, itu bukan kurangnya fitur yang mendorong pengembang distribusi untuk menginstal sesuatu yang berbeda dari shell Bourne yang lama /bin/shtetapi keinginan untuk menjadi patuh POSIX mungkin, yaitu berperilaku seperti Unix suka OS. Fakta bahwa shell POSIX memiliki lebih banyak fitur daripada shell Bourne yang lama hanya merupakan efek samping dari tujuan kepatuhan standar ini.

Ini juga merupakan fakta beberapa shell, terutama bash, berperilaku berbeda ketika dipanggil sh, dan ini sebagian besar menghilangkan fitur dari shell, bukan sebaliknya.

Jlliagre
sumber
16

Sejauh yang saya tahu shell Bourne asli tidak dapat digunakan oleh BSD dan proyek GNU, karena lisensi.

Saat itu Unix asli tidak memiliki lisensi dan proyek GNU membutuhkan shell yang berada di bawah GPL sehingga mereka menggunakan bash.

Hal yang sama berlaku untuk BSD4 induk dari semua BSD. Berkat gugatan AT&T, mereka perlu menulis ulang semua sumber dari Unix asli termasuk cangkang Bourne.

Dalam jalur BSD tradisional, shell Bourne dikirim sampai 4.3BSD-Reno (tetapi tidak lagi dengan Net / 2 dan 4.4BSD berikut). Untuk alasan lisensi itu kemudian diganti dengan sh-kompatibel bourne, seperti svr4 oleh Kenneth Almquist (sering disebut abu).

Dari FreeBSDs man sh

Perintah sh, shell Thompson, muncul di Versi 1 AT&T UNIX. Itu digantikan dalam Versi 7 AT&T UNIX oleh shell Bourne, yang mewarisi nama sh.

Versi sh ini ditulis ulang pada tahun 1989 di bawah lisensi BSD setelah shell Bourne dari AT&T System V Release 4 UNIX

Jadi kedua proyek dipaksa untuk tidak menggunakan shell Bourne dan puas dengan shell open source yang sebenarnya.

Raphael Ahrens
sumber
7

Ada masalah lain. Shell Bourne memang menggunakan sbrk () alih-alih malloc () dan ini membuatnya tidak terlalu portabel.

Setelah Shell Bourne menjadi OpenSource melalui OpenSolaris, saya membuat versi portabel hafway dan kemudian versi yang benar-benar portabel dengan mengganti sbrk () oleh malloc () dengan bantuan dari Geoff Collyer (orang yang sama yang membantu menghindari sbrk () di Korn Shell).

Alasan awal, mengapa saya membuat versi portabel dari Bourne Shell adalah saya suka membuat Editor Sejarah yang saya tulis untuk "bsh" saya antara tahun 1982 dan 1984 juga tersedia di Bourne Shell. Sementara itu, saya mem-porting sebagian besar karakteristik unik yang saya tulis untuk "bsh" ke Bourne Shell.

Ini antara lain:

  • Kompilasi dan bekerja hampir di semua tempat termasuk Cygwin (hampir 2x lebih cepat dari bash)
  • Editor sejarah dengan buffer cincin LRU
  • TERMCAP bawaan
  • Alias ​​canggih (alias persisten global, alias lokal, ....) dan bersama dengan builtin "dosh", Bourne Shell adalah satu-satunya implementasi Bourne Shell yang sama yang memungkinkan alias dengan parameter yang berbeda.
  • Dukungan untuk mengedit alias kompleks di editor riwayat dalam mode mentah.
  • Akses semua 32 bit kode keluar (2) melalui variabel .sh. *.
  • pengaturan waktu otomatis canggih dengan resolusi 6 digit
  • pushd / popd / dirs
  • builtin "temukan"
  • Pipa dari stderr
  • Menggunakan vfork () untuk kinerja yang lebih baik.
  • akhirnya memperbaiki semua bug yang didokumentasikan dari SVr4 Bourne Shell, mis. menangguhkan selalu berfungsi dalam mode kontrol pekerjaan. ...

Halaman manual online ada di: http://schillix.sourceforge.net/man/man1/bosh.1.html Sumber adalah bagian dari kotak alat schily di:

https://sourceforge.net/projects/schilytools/files/

Saya sarankan untuk menggunakan: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 atau versi yang lebih baru.

PS Saya tertarik dengan umpan balik

schily
sumber
Hai Joerg. Mengapa port mereka ke shell Bourne daripada shell yang sudah POSIXified seperti beberapa BSD sh atau pdksh?
Stéphane Chazelas
Porting Bourne Shell merupakan tantangan karena tidak menggunakan stdio. Ini adalah tantangan yang sama seperti mengambil sumber csh asli dan membuatnya mengkompilasi dengan mengganti printf non-stdio yang ditulis dalam assembler VAX. Tapi saya sudah menambahkan banyak fitur POSIX yang lebih baru ke Bourne Shell dan saya ingin tetap menggunakan Bourne Shell di SchilliX agar dapat boot dengan / anr / usr pada sistem file terpisah yang tidak mungkin dengan Korn Shell.
schily
Perhatikan juga bahwa saya ingin memverifikasi bahwa kecepatan ksh disebabkan oleh penggunaan vfork (). Sekarang saya mengonversi Bourne Shell untuk menggunakan vfork () persis secepat versi ksh terbaru. Ini adalah pengalaman yang hanya Anda dapatkan ketika memulai dengan kode sumber Bourne Shell asli.
schily
OK, tetapi sampai Anda membuat konforman POSIX sh, itu tidak akan menarik banyak minat. Saya ingat Anda bertanya pada kelompok austin ML tentang ketidakcocokan dengan POSIX dari shell Bourne, apakah itu sesuatu yang sedang Anda kerjakan (yang berarti melanggar kompatibilitas dengan shell Bourne)? Juga orang-orang (setidaknya saya) menganggap sintaks POSIX sh sebuah kemajuan di atas shell Bourne. Terus memanggil shell Bourne Anda, shell Bourne dapat mengirimkan kesan yang salah. Bagaimana dengan bimsh (Bourne ditingkatkan (ala vi / vim))?
Stéphane Chazelas
My Bourne Shell sudah lebih baik daripada ksh dalam beberapa aspek, misalnya menerapkan alias yang lebih baik, pushd / popd / dirs dan dukungan penggunaan sumber daya berdasarkan fitur UNIX modern, bukan jika apa yang dilakukan ksh yang masih berbasis SVr2. Karena Anda tampaknya tertarik dan terampil dalam shell, saya ingin mendapatkan ide tentang apa yang ingin Anda lihat selanjutnya di Bourne Shell setelah membaca: schillix.sourceforge.net/man/man1/bosh.1.html Perhatikan bahwa sejauh ini, saya memiliki semua kode baru # ifdef dan beberapa fitur (seperti pipa stderr) harus diaktifkan melalui set (1).
schily
4

Itu terkait dengan shell yang memberikan kompatibilitas mundur 100% . Anda tidak kehilangan apa pun yang dimiliki oleh shell asli tetapi mendapatkan lebih banyak fitur di atasnya. Tidak ada kerugian jadi mengapa ketinggalan fitur baru? Ini adalah alasan yang sama mengapa /bin/vibiasanya dikaitkan dengan vim .

JoelFan
sumber
5
Kelemahannya adalah bahwa orang menulis skrip yang bekerja pada satu sistem mereka, berpikir skrip mereka kompatibel ketika tidak. Saya pernah memperbaiki hampir seratus skrip shell Gentoo yang sebenarnya membutuhkan bash tetapi disebut / bin / sh. Mereka semua rusak ketika saya mengubah / bin / sh menjadi dash bukan bash.
Zan Lynx
3
"no downside" - kecepatan. misalnya bashjauh, jauh lebih lambat daripadadash
strugee
@ strugee Jika Anda mencari kecepatan peningkatan rentang ms dalam shell, Anda mungkin tidak menggunakan alat yang tepat untuk pekerjaan itu.
Chris Down
1
@ChrisDown mendefinisikan "peningkatan jangkauan ms"?
strugee
2
Sintaks POSIX sh tidak sepenuhnya kompatibel dengan sintaks Bourne sh. Misalnya, IFS=,; rm file1,file2,file3akan menghapus 3 file tersebut di shell Bourne. Itu (konyol) fitur telah dihapus di POSIX sh. Ada puluhan perbedaan kecil yang dapat menyebabkan skrip yang ditulis untuk shell Bourne bekerja secara berbeda dengan POSIX sh.
Stéphane Chazelas