Bash și sh execută un script diferit? Am executat un script shell cu bash și sh și am obținut același rezultat. Deci, care este diferența?
De asemenea, atunci când rulați doar ./executable
, folosește bash sau sh?
Comentarii
Răspuns
Acest lucru depinde de sistemul pe care îl executați. Unul dintre multe sisteme de operare, în special cele bazate pe Linux, sh
este un link către bash
.
În acest caz, există există încă unele diferențe de comportament în care bash
încearcă să semene mai mult cu cochilia Bourne tradițională când este numită sh
, dar acceptă totuși majoritatea bashismelor.
Pe alte sisteme de operare, cum ar fi cele bazate pe Debian, sh
este furnizat de dash
, nu de bash
. Asta face o diferență mult mai mare, deoarece dash
nu acceptă bashisme, fiind conceput pentru a fi o implementare curată a POSIX shell.
Pe sistemele de operare proprietare, este adesea furnizat fie de un cod POSIX ksh88
care, la fel ca dash
, nu implementează bashisme. Pe Solaris 10 și mai vechi, în funcție de PATH-ul dvs., sh
va fi probabil un shell Bourne moștenit, anterior lui POSIX.
În orice caz, probabil ați obținut aceeași ieșire cu testul dvs. pur și simplu pentru că scriptul dvs. nu folosea nicio comandă, opțiune sau sintaxă specifică bash
.
Când rulați ./executable
, ce shell va fi rulat depinde în esență de shebang-ul scris la începutul scriptului .executable. Aceasta va fi bash
dacă shebang o specifică:
#!/bin/bash ....
Dacă nu există shebang și apelați scriptul dintr-un shell compatibil POSIX, scriptul trebuie executat tehnic de primul sh
găsit în PATH. Mulți interpreți de tip shell cum ar fi bash
, dash
și ksh
se consideră POSIX, așa că interpretează scenariul. Rețineți că variabila de mediu SHELL
nu este utilizată aici.
Comentarii
- M-am uitat în jur în
/bin
și am constatat căsh
este o legătură simbolică cătredash
mai degrabă decâtbash
. Deci, cum au funcționat la fel? Nu era ' într-adevăr executarea niciunei comenzi script bash, doar comenzi terminale pentru a utiliza alte pachete ' instrumente. - Dacă scriptul dvs. shell apelează secvențial alte comenzi, orice interpret shell îl va rula cu același rezultat. Nimic neașteptat aici.
- Acest lucru nu este ' legat de întrebare, dar care este exact diferența dintre
bash
șidash
? - Ambele utilizează sintaxa shell Bourne. După cum am scris în răspunsul meu,
dash
este o implementare curată a standardului shell POSIX. Pe de altă parte,bash
este un shell cu un număr destul de mare de extensii și caracteristici non standard, unele inspirate dinksh
,ksh93
și alte cochilii, și unele bash specifice, cunoscute sub numele de bashisme. Există un instrument numit checkbashisms care ajută la identificarea a tot ceea ce nu este strict portabil într-un anumit script shell.
Răspuns
Da, ar putea fi, dar nu trebuie să fie. Cele două cochilii nu sunt aceleași, dar elementele de bază sunt compatibile. Verificați această postare pentru mai multe detalii.
Puteți utiliza următoarea linie dintr-un script pentru a verifica interpretul utilizat:
ps h -p $$ -o args="" | cut -f1 -d" "
Puteți specifica în mod explicit shell-ul care va fi utilizat atunci când scriptul este executat direct cu linia sheebang
:
#!/bin/sh
sau
#!/bin/bash
$SHELL
nu este utilizată pentru a decide ce shell va interpreta./executable
scenariu. ' nu spune neapărat care este shell-ul curent.