Apa itu / bin / dash?

27

Saya pikir /bin/shitu adalah symlink ke shell pilihan saya. Saya selalu menggunakan bash, jadi saya berasumsi itu /bin/shakan menunjuk ke /bin/bash. Ternyata, itu menunjuk ke /bin/dash.

Menjadi lebih lucu. Saya mulai dashdan melakukan echo $SHELLdan mencetak /bin/bash(jadi mereka pada dasarnya sama?). Namun, halaman manual dashsama sekali berbeda dari halaman manual bash(jadi mereka tidak sama?).

aioobe
sumber
1
@wzzrd, Apakah pertanyaan ini khusus untuk linux?
aioobe
1
huh, aku tidak bisa menghapus semua jawaban yang bagus ini, karena aku butuh 15 rep. Saya merasa cacat karena saya memiliki 18k pada stackoverflow: - /
aioobe
4
mmm dash .. bagaimana dengan / bin / crash (untuk penggemar gdb), / bin / slash (program penghematan), / bin / mash (masa sulit di Korea), / bin / sash (untuk pemandu sorak), / bin / thrash (sulit pada HDD Anda), / bin / flash (tetapi hanya jika Anda mengenkripsi data Anda), / bin / simpanan (semoga berhasil menemukan nanti), / bin / tunai (Anda selalu in-the-money), / bin / pash (romancing PC), / bin / gash (aaargggh!).
PP.
2
@PP - Saya pernah membaca / bin / thrash untuk penggemar musik Metal, dan / bin / slash untuk penggemar gitaris rock band 80-an ... :-P
gWaldo
1
Alasan echo $SHELLmencetak /bin/bashadalah karena variabel itu ditetapkan untuk shell default yang dimulai ketika Anda login daripada shell saat ini yang Anda jalankan. Mulai ksh atau zsh dari Bash prompt dan echo $SHELLmasih akan mengatakan /bin/bash. Gunakan psuntuk melihat apa yang sedang berjalan.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

43

Debian dan Ubuntu beralih ke tanda hubung (iirc) karena beberapa hal. Pertama-tama, Bash telah menjadi besar selama bertahun-tahun. Bahkan, /bin/bashbiner pada sistem Ubuntu 8.04 saya hampir sepuluh kali lipat (!) /bin/dash. Sekarang, itu tidak masalah banyak untuk penggunaan shell sehari-hari, tetapi itu penting dalam situasi berikut:

  • Dash jauh lebih kecil dan karenanya memuat lebih cepat, yang merupakan anugerah bagi skrip init. Jika Anda harus memulai banyak dari mereka, memuat Dash bukannya Bash setiap kali, mempercepat segalanya.
  • Karena ukuran Dash yang lebih kecil, Debian dan Ubuntu dapat memangkas sebagian besar ukuran initrd mereka, menyisakan lebih banyak ruang untuk hal-hal lain (dan sekali lagi, mempercepat segalanya).

Kelemahan dari menggunakan Dash daripada Bash untuk skrip, adalah bahwa banyak orang menggunakan basa sintaksis yang hanya dimiliki Bash, yang disebut Bashism . Contoh Bashisme adalah substring, seperti ini:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

Dan ini:

echo ${a#123}
4567890

Dash, di sisi lain terutama bertujuan untuk mematuhi POSIX (dan tidak lebih dari itu), akan memberi Anda kesalahan substitusi yang buruk jika Anda mencoba ini:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

Ini akan menjadi masalah jika Anda menggunakan /bin/sh(dan karenanya dash) sebagai penerjemah untuk shellscripts Anda dan menggunakan Bashisme di dalamnya. Debian dan Ubuntu memiliki halaman wiki yang bagus tentang Bashisme dan mengapa mereka buruk dalam skrip shell secara umum dan skrip init pada khususnya. Karena itu, Anda harus secara sadar memilih apakah Anda perlu /bin/shatau /bin/bashsebagai juru bahasa naskah Anda.

Dash tidak seharusnya digunakan sebagai shell default pada sistem Anda. Cukup gunakan Bash untuk itu. Untuk portabilitas skrip Anda, Anda dapat menggunakan Dash sebagai penerjemah untuk meningkatkan peluang skrip berjalan di Linux rasa dan Unix lainnya.

wzzrd
sumber
1
Jika Anda menulis skrip dengan Bashisme, harap sebutkan /bin/bash; banyak sistem non-Linux memiliki shcangkang aktual yang bahkan hampir tidak kompatibel dengannya bash.
Chris S
echo ${a#123}bukan bashism, itu bagian dari spesifikasi ekspansi Parameter POSIX. pubs.opengroup.org/onlinepubs/009695399/utilities/... Anda hanya tidak mendapatkan gaya sed yang lebih maju, Bash, yang posix adalah gaya substring + karakter ekspansi sederhana. Artinya, POSIX juga memungkinkanecho ${a#*6}
JM Becker
0

Karena tidak semua shell disetel $SHELLsaat dijalankan, Anda mengetahui shell Anda saat ini dengan:

echo $0

Jika itu memberikan kesalahan, itu csh, jika tidak argv[0]Anda dipanggil, yang biasanya shell, mungkin dengan -tanda hubung terkemuka , untuk menunjukkan bahwa itu adalah shell login.

Ini tidak dijamin , karena di argv[0]bawah kendali proses permohonan, tetapi dalam praktiknya pendekatan yang paling dapat diandalkan.

Phil P
sumber