Apa gunanya terhubung ke dash?

36

Saya bertanya-tanya apa gunanya shdikaitkan secara simbolis dash? Saya mengerti bahwa dashseharusnya lebih cepat daripada bash, tetapi saya tidak yakin mengapa shshell asli tidak ada di sh.

Atau jika ada mengapa tidak shditautkan bash?

NerdOfCode
sumber

Jawaban:

72

Jawaban singkat untuk "mengapa shell sh asli tidak hadir sh" adalah bahwa tidak ada sh asli.

Baiklah, ada: ini cangkang Thompson . Versi 1 memiliki beberapa fitur yang kita kenal sekarang, khususnya pengalihan dan pipa (baca makalah Dennis Ritchie tentang sejarah awal Unix ). Versi selanjutnya menambahkan fitur seperti eksekusi latar belakang &, globbing (diimplementasikan dengan program eksternal), dan beberapa bentuk penawaran, tetapi tidak memiliki variabel atau struktur kontrol bersarang. Persyaratan dan loop disediakan melalui program eksternal if(yang mengambil satu syarat dan satu perintah sebagai argumen) dan goto(yang berfungsi dengan mengubah posisi file induknya dalam file skrip).

Pada tahun 1979, di Unix V7 , cangkang Thompson digantikan /bin/sholeh cangkang Bourne . Rilis pertama sudah memiliki banyak fitur yang hadir di dash hari ini, dan versi berikutnya memperkenalkan lebih banyak . Beberapa tahun kemudian, shell Korn datang ke tempat kejadian, dengan set fitur yang berkembang; banyak varian Unix menginstalnya dengan nama ksh.

Pada tahun 1992, POSIX mengkodifikasikan serangkaian shfitur minimum yang pada dasarnya adalah Bourne plus beberapa hal. Sistem apa pun yang menamakan dirinya "Unix" harus mengimplementasikan setidaknya fitur-fitur ini. Sistem Unix Komersial biasanya menggunakan ksh sebagai POSIX sh, tetapi beberapa (misalnya OSF / 1 ) memiliki ksh mereka sendiri.

Baik cangkang Bourne maupun cangkang Korn adalah open source sampai saat ini, jadi ketika dunia Linux mulai terbentuk pada pertengahan 1990-an, mereka tidak tersedia. /bin/shpasti ada sesuatu yang lain. Sebagian besar distribusi Linux menggunakan bash , sebuah shell dari proyek GNU yang cenderung antara Bourne dan Korn dalam hal fitur scripting, dan jauh lebih baik daripada keduanya untuk penggunaan interaktif). Satu-satunya alternatif yang layak adalah pdksh ("domain publik Korn shell"), gratis (sekarang dihentikan, tetapi hidup sebagai mksh , yang dikembangkan secara aktif ), tetapi saya tidak ingat distribusi Linux menggunakan pdksh sebagai/bin/sh, Saya tidak tahu mengapa, saya kira karena distribusi Linux selalu merupakan distribusi GNU / Linux, pada dasarnya mengirimkan versi GNU dari alat apa pun yang versi GNUnya ada.

Ada juga beberapa implementasi open source yang shdisebut "abu", terutama shell Almquist , tetapi mereka sangat tidak lengkap, kurang beberapa fitur POSIX yang ingin digunakan orang. Seorang programmer yang adalah seorang pengelola Debian, Herbert Xu , memperluas abu untuk menjadikannya POSIX compliant. Akhirnya versinya diganti menjadi dash, dan ada beberapa dorongan untuk membuatnya /bin/shdi Debian bukan bash. Ubuntu dimulai sebelum Debian mulai memperlakukan bashisme secara sistematis (penggunaan fungsi spesifik bash dalam #!/bin/shskrip) sebagai bug . Keduanya beralih kemudian ( Ubuntu 6.10 , Debian hanya pada tahun 2009 ( itu adalah tujuan untuk lenny tetapi saklar hanya dibuat setelah rilis lenny, yaitu dalam pemerasan)).

Sebuah besar alasan untuk menggunakan dasbor sebagai bukan pesta seperti /bin/shadalah bahwa hal itu secara signifikan lebih cepat. Ini sangat penting untuk Ubuntu, yang telah berusaha untuk menjaga waktu boot yang singkat sejak awal. Dash juga cenderung menggunakan lebih sedikit memori daripada bash, yang agak penting untuk skrip wrapper yang tinggal hanya untuk melakukan sedikit pembersihan ketika program yang mendasarinya keluar. Manfaat lain dari dash adalah bahwa ia hanya bergantung pada libc (pustaka sistem inti) sedangkan bash juga bergantung pada pustaka dukungan terminal (tidak dapat memulai tanpa mereka, bahkan untuk menjalankan skrip); ini berarti bahwa dasbor memiliki peluang lebih baik untuk terus bekerja pada sistem yang rusak.

Pada beberapa titik selama abad ke-21, cangkang Korn menjadi open source, dan versi open source dari cangkang Bourne muncul (versi lama, karena pengembangan telah berhenti bertahun-tahun sebelumnya). Tapi dash dan bash terlalu kuat mengakar di dunia Linux sehingga mereka tidak dapat diterima, terutama shell Bourne karena nilainya saat ini hanya historis. Dash menggusur bash karena memiliki manfaat yang jelas, tetapi tidak ada pesaing lain yang memiliki keunggulan yang menentukan /bin/sh.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya berpendapat bahwa ada alasan bagus untuk menggunakan ksh93 sebagai / bin / sh - ini adalah salah satu shell POSIX dengan kinerja tertinggi yang tersedia. Setuju bahwa di mana-mana dasbor adalah masalah waktu.
Charles Duffy
2
@CharlesDuffy Ksh93 lebih cepat dalam melakukan hal-hal yang kompleks, tetapi dash mengalahkannya untuk waktu startup, dan untuk skrip sederhana (seperti semua panggilan ke system(3) yang dibuat aplikasi) itulah faktor dominan.
Gilles 'SANGAT berhenti menjadi jahat'
21

Kecepatan dan kepatuhan POSIX (dengan kata lain, portabilitas) adalah faktor utama. Ingat itu /bin/shdimaksudkan untuk skrip sistem, yang mungkin atau mungkin tidak berasal dari versi lama Ubuntu dan / atau sistem lain.

Tentu, fitur mengkilap dari bashyang keren untuk digunakan bagi kita pengguna, tetapi ketika datang untuk menjalankan hal di lingkungan di mana Anda harus mengelola beberapa server / sistem yang berbeda - memiliki shell yang sesuai dengan POSIX membuat banyak perbedaan. Terutama, jika Anda seorang sysadmin baru dan lingkungan yang diwarisi dengan banyak skrip.

Mengenai mengapa shell Bourne asli tidak ada, itu sederhana - itu adalah produk eksklusif yang awalnya dimiliki oleh AT&T Bell Labs.

Juga, sebenarnya ada penjelasan eksplisit tentang wiki Ubuntu tentang itu:

Mengapa perubahan ini dilakukan? Alasan utama untuk mengganti shell default adalah efisiensi. bash adalah shell dengan fitur lengkap yang luar biasa yang cocok untuk penggunaan interaktif; memang, itu masih shell login default. Namun, ini agak besar dan lambat untuk memulai dan beroperasi dengan perbandingan dengan tanda hubung. Sejumlah besar contoh shell dimulai sebagai bagian dari proses boot Ubuntu. Daripada mengubah masing-masing secara terpisah untuk berjalan secara eksplisit di bawah / bin / dash, perubahan yang akan membutuhkan pemeliharaan yang berkelanjutan dan yang akan bertanggung jawab untuk mundur jika tidak diperhatikan, tim pengembangan inti Ubuntu merasa bahwa yang terbaik adalah hanya mengubah shell default. Peningkatan kecepatan boot di Ubuntu 6.10 sering dikaitkan secara salah dengan Upstart, yang merupakan platform yang baik untuk pengembangan sistem init di masa depan tetapi di Ubuntu 6. 10 terutama berjalan dalam mode kompatibilitas Sistem V dengan hanya perubahan perilaku kecil. Perbaikan ini sebenarnya sebagian besar disebabkan oleh perubahan / bin / sh.

Dan inilah catatan tentang portabilitas:

Manual kebijakan Debian telah lama mengamanatkan bahwa "skrip shell menentukan '/ bin / sh' sebagai juru bahasa hanya harus menggunakan fitur POSIX"; sebenarnya, persyaratan ini sudah ada sejak jauh sebelum dimulainya proyek Ubuntu. Selain itu, skrip shell yang diharapkan portabel untuk sistem Unix lain, seperti BSD atau Solaris, sudah memenuhi persyaratan ini. Dengan demikian, kami merasa bahwa dampak kompatibilitas dari perubahan ini akan minimal.

Lihat https://wiki.ubuntu.com/DashAsBinSh

Sergiy Kolodyazhnyy
sumber
Tidak dashmendukung fitur yang tidak diharuskan POSIX?
NerdOfLinux
@NerdOfLinux Tidak masalah apa yang didukung / bin / sh selain POSIX (selama tambahan itu tidak merusak skrip POSIX); yang penting mendukung semuanya POSIX (dan secepat mungkin). Selama dasbor memenuhi persyaratan ini, / bin / sh dapat menautkannya.
Guntram Blohm mendukung Monica
9

Dalam distribusi GNU / Linux, "asli /bin/sh" sebenarnya Bash.

GNU menginginkan shell seperti Bourne yang berada di bawah GPL, jadi itu sebabnya mereka memilih Bash untuk mereka /bin/sh, bukan Bourne, yang bukan berlisensi GPL. Distro Linux modern mewarisi keputusan ini hingga menjadi standar defacto untuk /bin/shmenjadi Bash. Shell Bourne asli ("sh") telah digunakan di Unix non-Linux lainnya, bahkan baru-baru ini seperti Solaris 10, tetapi tidak pernah menjadi andalan dalam distribusi Linux.

Beralih /bin/shdari bash ke dash adalah keputusan Debian (diwarisi oleh Ubuntu) yang sebagian besar dimotivasi oleh kecepatan - itu datang pada saat mereka berupaya keras untuk meningkatkan kecepatan boot, dan sebagian besar waktu boot CPU pada waktu yang konsisten menjalankan skrip init.

Bash terus digunakan sebagai shell interaktif / login default untuk pengguna, tetapi Dash adalah yang di /bin/shdan yang dieksekusi untuk skrip sistem seperti skrip init.

Dash sangat cepat, tetapi juga sangat kompatibel dengan POSIX - standar yang selaras dengan shell Bourne. Jadi, dengan cara, dengan beralih dari Bash ke Dash, kami bergerak kembali ke shell yang lebih dekat dengan Bourne.

thomasrutter
sumber
"Dash sangat cepat, tetapi juga sangat kompatibel dengan POSIX - standar yang selaras dengan shell Bourne." Ya, meskipun POSIX lebih dekat hubungannya ksh, saya katakan. Saya tidak ingat shell Bourne memiliki ekspansi aritmatika `$ (())`, yang merupakan POSIX.
Sergiy Kolodyazhnyy
1
Juga, dalam Bourne, ^adalah karakter pipa - jadi echo foo ^ catakan memancarkan foo ^ catdalam POSIX sh, tetapi foodalam Bourne; tes khusus ini adalah bagaimana Autoconf memberi tahu keduanya.
Charles Duffy
Menarik, jadi oleh POSIX sh maksudmu Korn?
thomasrutter
0

/bin/shterkait dengan /bin/dashapa yang saya yakini sebagai alasan kompatibilitas. Banyak skrip mulai dengan

#!/bin/sh

jadi dengan pindah ke dashdan tidak membuat tautan simbolis, banyak skrip akan gagal berjalan dengan baik (atau sama sekali) jika /bin/shtidak ada sama sekali.

Perubahan dibuat dari bashmenjadi dashkarena menurut https://wiki.ubuntu.com/DashAsBinSh :

Alasan utama untuk mengganti shell default adalah efisiensi. bash adalah shell dengan fitur lengkap yang luar biasa yang cocok untuk penggunaan interaktif; memang, itu masih shell login default. Namun, ini agak besar dan lambat untuk memulai dan beroperasi dengan perbandingan dengan tanda hubung. Sejumlah besar contoh shell dimulai sebagai bagian dari proses boot Ubuntu. Daripada mengubah masing-masing secara terpisah untuk berjalan secara eksplisit di bawah / bin / dash, perubahan yang akan membutuhkan pemeliharaan yang berkelanjutan dan yang akan bertanggung jawab untuk mundur jika tidak diperhatikan, tim pengembangan inti Ubuntu merasa bahwa yang terbaik adalah hanya mengubah shell default.

shtidak ditautkan ke bash, karena

Manual kebijakan Debian telah lama mengamanatkan bahwa "shell script menentukan '/ bin / sh' sebagai penerjemah hanya harus menggunakan fitur POSIX"

Jika Anda ingin menggunakan bashsebagai /bin/sh:

Jika masalahnya lebih luas dan Anda ingin mengubah shell sistem default kembali, maka Anda dapat menginstruksikan sistem manajemen paket untuk berhenti menginstal tanda hubung sebagai / bin / sh:

sudo dpkg-reconfigure dash

Ada beberapa fitur yang dashmembuat bash tidak, seperti:

bahkan ada kemungkinan di luar bahwa ada beberapa skrip yang sekarang bergantung pada beberapa fitur tanda hubung yang tidak disediakan oleh bash!

NerdOfLinux
sumber
Saya sudah mengerti kompatibilitas mungkin merupakan faktor tetapi saya sedang mencari jawaban yang tidak begitu jelas dan lebih mendalam ...
NerdOfCode
2
Jadi jika saya harus menginstal shell Bourne asli shuntuk /bin/sh, akan sekrup ini sampai mereka boot script?
hidangan penutup
Mungkin yang terbaik untuk mencoba ini di mesin virtual terlebih dahulu sebelum menyebar ke dunia nyata ...
NerdOfCode
2
Anda harus pergi /bin/shsebagai shell yang disediakan oleh distribusi karena itulah yang mereka targetkan dengan skrip boot dan sejenisnya. Tetapi jika Anda menggantinya dengan Bourne, sebagian besar akan kompatibel. Saya akan membayangkan akan ada kerusakan meskipun, hanya karena perbedaan menit vs jumlah kode. Tentu saja Anda bebas menggunakan shell mana pun dalam skrip Anda sendiri dengan hashbang khusus.
thomasrutter
1
@ mckenzm /bin/shLink shell mana yang terpisah dari yang ditetapkan pengguna mana saja sebagai shell login awal mereka. Target /bin/shtidak tergantung pada mana pengguna mencari, dan Anda lakukan perlu menggunakan sudo--atau beberapa cara lain untuk bertindak sebagai user root - untuk mengubahnya. Juga, secara umum dan untuk paket apa pun, dpkg-reconfigureharus dijalankan sebagai root. Sebaliknya, pengguna biasanya diizinkan untuk mengubah shell login awal mereka sendiri dan dapat melakukannya dengan chshperintah. Nama shell login awal seseorang juga masuk $SHELLdan digunakan untuk beberapa shell non-login interaktif juga.
Eliah Kagan