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
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 attsh
är en symbolisk länk tilldash
snarare änbash
. 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
ochdash
? - Båda använder Bourne-skal-syntaxen. Som jag skrev i mitt svar är
dash
en ren implementering av POSIX-skalstandarden. Å andra sidan ärbash
ett skal med ett ganska stort antal tillägg och icke standardfunktioner, en del inspirerade avksh
,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
$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.