Apa itu sh
sh
(atau Bahasa Perintah Shell) adalah bahasa pemrograman yang dijelaskan oleh standar POSIX . Ini memiliki banyak implementasi ( ksh88
, dash
, ...). bash
juga dapat dianggap sebagai implementasi sh
(lihat di bawah).
Karena sh
ini adalah spesifikasi, bukan implementasi, /bin/sh
adalah symlink (atau hard link) untuk implementasi aktual pada sebagian besar sistem POSIX.
Apa itu bash
bash
dimulai sebagai sh
implementasi -kompatibel (meskipun ia mendahului standar POSIX beberapa tahun), tetapi seiring berjalannya waktu ia telah memperoleh banyak ekstensi. Banyak dari ekstensi ini dapat mengubah perilaku skrip POSIX shell yang valid, jadi dengan sendirinya bash
bukan shell POSIX yang valid. Sebaliknya, ini adalah dialek bahasa shell POSIX.
bash
mendukung --posix
switch, yang membuatnya lebih kompatibel dengan POSIX. Itu juga mencoba untuk meniru POSIX jika dipanggil sebagai sh
.
sh = bash?
Untuk waktu yang lama, /bin/sh
digunakan untuk menunjuk /bin/bash
pada sebagian besar sistem GNU / Linux. Akibatnya, hampir menjadi aman untuk mengabaikan perbedaan antara keduanya. Tapi itu mulai berubah baru-baru ini.
Beberapa contoh populer sistem di mana /bin/sh
tidak menunjuk /bin/bash
(dan beberapa di antaranya /bin/bash
bahkan mungkin tidak ada) adalah:
- Modern Debian dan Ubuntu sistem, yang symlink
sh
untuk dash
secara default;
- Busybox , yang biasanya dijalankan selama waktu boot sistem Linux sebagai bagian dari
initramfs
. Ia menggunakan ash
implementasi shell.
- BSD, dan secara umum sistem non-Linux. OpenBSD menggunakan
pdksh
, keturunan dari shell Korn. FreeBSD's sh
adalah turunan dari shell UNIX Bourne yang asli. Solaris memiliki sendiri sh
yang untuk waktu yang lama tidak sesuai dengan POSIX; implementasi gratis tersedia dari proyek Heirloom .
Bagaimana Anda bisa mengetahui /bin/sh
poin apa yang ada di sistem Anda?
Kerumitannya /bin/sh
bisa berupa tautan simbolik atau tautan keras. Jika itu tautan simbolis, cara portabel untuk mengatasinya adalah:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Jika ini tautan keras, coba
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
Faktanya, -L
flag tersebut mencakup symlink dan hardlink, tetapi kelemahan dari metode ini adalah tidak portable - POSIX tidak perlu find
mendukung -samefile
opsi, meskipun GNU menemukan dan FreeBSD menemukan mendukungnya.
Garis Shebang
Pada akhirnya, terserah Anda untuk memutuskan mana yang akan digunakan, dengan menulis baris «shebang».
Misalnya
#!/bin/sh
akan menggunakan sh
(dan apa pun yang terjadi menunjuk ke),
#!/bin/bash
akan digunakan /bin/bash
jika tersedia (dan gagal dengan pesan kesalahan jika tidak). Tentu saja, Anda juga dapat menentukan implementasi lain, mis
#!/bin/dash
Yang mana yang akan digunakan
Untuk skrip saya sendiri, saya lebih suka sh
karena alasan berikut:
- itu standar
- itu jauh lebih sederhana dan lebih mudah dipelajari
- itu portabel di seluruh sistem POSIX - bahkan jika mereka tidak memilikinya
bash
, mereka diharuskan memilikinyash
Ada keuntungan menggunakan bash
juga. Fitur-fiturnya membuat pemrograman lebih mudah dan mirip dengan pemrograman dalam bahasa pemrograman modern lainnya. Ini termasuk hal-hal seperti scoping variabel lokal dan array. Plain sh
adalah bahasa pemrograman yang sangat minimalis.