Vad är skillnaden mellan att använda bash och sh för att köra ett skript?

Utför bash och sh ett skript annorlunda? Jag körde ett skalskript med både bash och sh och fick samma utdata. Så vad är skillnaden?

Och när du bara kör ./executable, använder den bash eller sh?

Kommentarer

  • @Pandya $SHELL -variabeln används inte för att avgöra vilket skal som ska tolka ./executable manus. Den ' säger inte nödvändigtvis vad det aktuella skalet är heller.
  • @jlliagre oh! ok. wiki.debian.org säger " SHELL = Det aktuella skalet. "
  • @Pandya ska det faktiskt sägas " Användaren ' s inloggningsskal ". Det aktuella skalet kan vara annorlunda.

Svar

Det beror på vilket system du kör. Ett många operativsystem, särskilt Linux-baserade, sh är en länk till bash.

I sådant fall finns det är fortfarande vissa skillnader i beteende där bash försöker vara mer som traditionellt bourne-skal när det kallas sh, men det accepterar fortfarande de flesta bashismer. / p>

På vissa andra operativsystem, som Debian-baserade, tillhandahålls sh av dash, inte bash. Det gör en mycket större skillnad eftersom dash inte stöder bashismer, eftersom de är utformade för att vara en ren POSIX-skalimplementering.

På egna OS, sh tillhandahålls ofta antingen av en POSIX-kompatibel ksh88 som precis som dash inte implementerar basism. Beroende på vad din PATH är på Solaris 10 och äldre kommer sh sannolikt att vara ett äldre Bourne-skal som föregår POSIX.

I vilket fall som helst har du sannolikt samma utdata med ditt test helt enkelt för att ditt skript inte använde något bash specifikt kommando, alternativ eller syntax.

När du kör ./executable, vilket skal som ska köras beror i huvudsak på shebang som skrevs i början av .executable-skriptet. Det kommer att vara bash om shebang anger det:

#!/bin/bash .... 

Om det inte finns någon shebang och du ringer till manuset från ett POSIX-kompatibelt skal ska skriptet tekniskt köras av den första sh som finns i PATH. Många skaltolkar som bash, dash och ksh anser sig vara POSIX så kommer det tolka manuset. Observera att SHELL miljövariabel inte används här.

Kommentarer

  • Jag tittade runt i /bin och jag fann att sh är en symbolisk länk till dash snarare än bash. Så hur körde de samma? ' körde inte riktigt alla bash-skriptkommandon, bara terminalkommandon för att använda andra paket ' -verktyg.
  • Om ditt skalskript bara sekventiellt ringer till andra kommandon kommer alla skaltolk att köra det med samma resultat. Inget oväntat här.
  • Det här är inte ' t relaterat till frågan, men vad exakt är skillnaden mellan bash och dash?
  • Båda använder Bourne-skal-syntaxen. Som jag skrev i mitt svar är dash en ren implementering av POSIX-skalstandarden. Å andra sidan är bash ett skal med ett ganska stort antal tillägg och icke standardfunktioner, en del inspirerade av ksh, ksh93 och andra skal, och vissa bash-specifika, så kallade basism. Det finns ett verktyg som heter checkbashisms som hjälper till att identifiera allt som inte är strikt bärbart i ett visst skalskript.

Svar

Ja det kan vara, men det behöver inte vara. De två skalen är inte desamma, men grunderna är kompatibla. Kontrollera det här inlägget för mer information.

Du kan använda följande rad i ett skript för att kontrollera tolk som används:

ps h -p $$ -o args="" | cut -f1 -d" " 

Du kan uttryckligen ange skalet som ska användas när skriptet körs direkt med sheebang -raden:

#!/bin/sh 

eller

#!/bin/bash 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *