Dlaczego otrzymuję różne wyniki w przypadku sh i bash?

8

Mam następujący prosty skrypt:

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

Dane wyjściowe w przypadku, gdy działam z sh file.sh:

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

Dane wyjściowe w przypadku, gdy działam z bash file.sh:

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

Mam dwa zapytania:

  1. Jeśli napisałem linię shabang określającą powłokę, czy nie powinna ona działać z bash, czy używam, sh file.shczy bash file.sh?

  2. Rozumiem, że $BASH_VERSIONsh nie rozpoznaje, ale z czym jest problem dla pętli? Dlaczego nie drukuje liczb?

rishiag
źródło

Odpowiedzi:

16

shskorupa Bourne'a jest stara . Jego zachowanie jest określone przez standard POSIX . Jeśli chcesz nowego zachowania, skorzystaj bashz powłoki Bourne Again, która ciągle dodaje nowe funkcje. W wielu systemach shjest po prostu bashi bashwłącza tryb zgodności, gdy działa pod tą nazwą. Na Ubuntu shjest dashpowłoką Debian Almquist.

Rozszerzenie nawiasu klamrowego jest stosunkowo nową funkcją i nie będzie dostępne również w starszych basach. Na pewno nie powinno być sh.

Linia shebang jest przestrzegana tylko wtedy, gdy wywołasz skrypt jako plik wykonywalny:

./myscript.sh

Mogę dać skryptowi dowolny shebang i nadal mieć go otwarty w Pythonie, uruchamiając:

python myscript.sh

Zobacz te doskonałe pytania dotyczące systemów Unix i Linux:

muru
źródło
5

SH jest głupi. Nic nie da się zrobić.

Zna tylko najbardziej podstawowe polecenia. Nie robi nic więcej.

Nie może zrozumieć {1..99} jako wartości liczbowej. Rozumie to jako ciąg.

SH / Dash nie został opracowany. Ma to być monit alarmowy w sytuacjach DIRE (w trybie interaktywnym. W przeciwnym razie jest to naprawdę dobra rzecz dla skryptów).

Bash jest zalecany, ponieważ może zrobić wszystko, co może SH, a także najnowsze funkcje dostosowywania i zaawansowane funkcje.

W odpowiedzi na nr 1 #!jest on analizowany tylko wtedy, gdy program jest wywoływany bezpośrednio. (jak w, ./program.sh)

Kaz Wolfe
źródło
6
Ma to być wezwanie alarmowe w przypadku okoliczności DIRE.dash, Które, jak mówisz, zapewnia shUbuntu, nie występuje głównie „jako powiadomienie alarmowe w przypadku okoliczności DIRE”, ale zamiast tego system może działać i uruchamiać się szybko . W ten sposób, dashjest dobrze nadaje się do zastosowania w nowoczesnym systemie operacyjnym, ale to, co jest dobrze nadaje się do to jako niskiego profilu, szybki powłoki dla skryptów - szczególnie, uruchamianie skryptów systemu podczas uruchamiania duży, skomplikowany, nowoczesny OS, z minimalnym narzut wydajności.
Eliah Kagan
@EliahKagan Naprawdę używasz SH tylko wtedy, gdy coś jest strasznie nie tak.
Kaz Wolfe
1
Używasz shdość stale, a szczególnie intensywnie jako buty Ubuntu. Jest to szczególnie ważne ze względu na zautomatyzowane użycie skryptów, a jest to bardzo ważny przypadek użycia w Ubuntu. (Jeśli było usunąć z /bin/shdowiązania - tak, że w efekcie, nie byłoby „nie SH” - wszystko pójdzie bardzo źle: Ubuntu nie mógł uruchomić do stanu używalności.)
Eliah Kagan
@EliahKagan Kiedy ostatnio używałeś SH jako preferowanego terminala? Wiem, że używasz go do pisania skryptów, ale kiedy faktycznie używasz go w trybie interaktywnym?
Kaz Wolfe
2
Wczoraj, aby sprawdzić, jak przenośne było polecenie. Ale twój punkt widzenia, że ​​interaktywne użycie myślnika jest rzadkie, jest słuszny. (A zresztą kontekst mojego interaktywnego użycia wciąż był zorientowany na skrypty.) .... Ale „use” nie oznacza „use interaktywnego”, a co ważniejsze, przypadek użycia w tym pytaniu nie jest interaktywny!
Eliah Kagan