Mengapa saya mendapatkan output berbeda jika sh dan bash?

8

Saya memiliki skrip sederhana berikut:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

Output jika saya menjalankan sh file.sh:

Bash version ...
{1..99..2}

Output jika saya menjalankan bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

Saya punya dua pertanyaan:

  1. Jika saya telah menulis shell shabang line yang menentukan, tidakkah seharusnya dijalankan dengan bash apakah saya menggunakan sh file.shatau bash file.sh?

  2. Saya mengerti bahwa $BASH_VERSIONtidak dikenali oleh sh tetapi apa masalah dengan untuk loop? Mengapa tidak mencetak angka?

Rishiag
sumber

Jawaban:

16

sh, kulit Bourne, sudah tua . Perilakunya ditentukan oleh standar POSIX . Jika Anda ingin perilaku baru, gunakan bash, shell Bourne Again, yang mendapat fitur baru ditambahkan setiap saat. Pada banyak sistem, shhanya bash, dan bashmenyalakan mode kompatibilitas ketika dijalankan dengan nama itu. Di Ubuntu, shadalah dash, shell Debian Almquist.

Perluasan brace adalah fitur yang relatif baru , dan tidak akan tersedia di bash lama juga. Ini tentu tidak harus dalam sh.

Baris shebang hanya dihormati jika Anda menyebut skrip sebagai executable:

./myscript.sh

Saya dapat memberikan skrip apa saja shebang dan masih membuatnya terbuka dengan Python dengan menjalankan:

python myscript.sh

Lihat pertanyaan luar biasa ini di Unix & Linux:

muru
sumber
5

SH itu bodoh. Tidak bisa berbuat apa-apa.

Hanya tahu perintah paling dasar. Itu tidak melakukan hal lain.

Itu tidak dapat memahami {1..99} sebagai nilai numerik. Itu memahaminya sebagai string.

SH / Dash tidak dikembangkan. Ini dimaksudkan sebagai prompt darurat untuk keadaan DIRE (dalam mode interaktif. Jika tidak, ini adalah hal yang sangat baik untuk skrip.).

Bash direkomendasikan karena dapat melakukan semua yang SH bisa, serta yang terbaru dalam kustomisasi dan fitur canggih.

Sebagai jawaban # 1, #!ini hanya diurai jika program dipanggil secara langsung. (seperti pada, ./program.sh)

Kaz Wolfe
sumber
6
" Ini dimaksudkan untuk menjadi prompt darurat untuk keadaan DIRE. " dash, Yang seperti yang Anda katakan menyediakan shdi Ubuntu, tidak hadir terutama "menjadi prompt darurat untuk keadaan DIRE" tetapi sebaliknya sehingga sistem dapat berjalan, dan mulai , cepat . Dengan cara ini, dashsangat cocok untuk digunakan dalam OS modern, tetapi apa yang cocok untuk itu adalah sebagai shell profil rendah, cepat untuk skrip - terutama, menjalankan skrip sistem saat boot OS besar, kompleks, modern, dengan minimal overhead kinerja.
Eliah Kagan
@ EliahKagan Anda benar-benar hanya menggunakan SH jika sesuatu ketika sangat salah.
Kaz Wolfe
1
Anda menggunakan shcukup terus-menerus, dan khususnya secara intensif ketika Ubuntu melakukan boot. Ini terutama penting untuk penggunaan skrip otomatisnya, dan itu adalah kasus penggunaan yang sangat penting di Ubuntu. (Jika Anda adalah untuk menghapus yang /bin/shsymlink - sehingga, pada dasarnya, akan ada "tidak ada SH" - hal-hal yang akan sangat salah: Ubuntu tidak bisa boot ke kondisi yang berguna.)
Elia Kagan
@EliahKagan Kapan terakhir kali Anda menggunakan SH sebagai terminal pilihan Anda? Saya tahu Anda menggunakannya untuk skrip, tetapi kapan Anda benar-benar menggunakannya dalam mode interaktif?
Kaz Wolfe
2
Kemarin, untuk memeriksa seberapa portabel perintah itu. Tetapi poin Anda bahwa penggunaan dasbor interaktif jarang terjadi adalah valid. (Lagi pula, konteks penggunaan interaktif saya masih berorientasi pada scripting.) .... Tapi "penggunaan" tidak berarti "penggunaan interaktif," dan yang lebih penting, kasus penggunaan dalam pertanyaan ini bukan yang interaktif!
Eliah Kagan