Care este diferența dintre utilizarea bash și sh pentru a rula un script?

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

  • @Pandya Variabila $SHELL nu este utilizată pentru a decide ce shell va interpreta ./executable scenariu. ' nu spune neapărat care este shell-ul curent.
  • @jlliagre oh! Bine. wiki.debian.org spune " SHELL = Învelișul actual. "
  • @Pandya ar trebui să spună de fapt " shell-ul de conectare al utilizatorului ' ". Învelișul actual ar putea fi diferit.

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ătre dash mai degrabă decât bash. 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 și dash?
  • 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 din ksh, 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 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *