Udfører bash og sh et script forskelligt? Jeg udførte et shell-script med både bash og sh og fik den samme output. Så hvad er forskellen?
Også når du bare kører ./executable
, bruger den bash eller sh?
Kommentarer
Svar
Det afhænger af det system, du kører. Én mange operativsystemer, især Linux-baserede, sh
er et link til bash
.
I et sådant tilfælde er der er stadig nogle forskelle i adfærd, hvor bash
forsøger at være mere som traditionel bourne shell, når den kaldes sh
, men den accepterer stadig de fleste bashismer.
På nogle andre operativsystemer, som Debian-baserede, leveres sh
af dash
, ikke bash
. Det gør en meget større forskel, da dash
understøtter ikke bashismer, idet de er designet til at være en ren implementering af POSIX-shell.
På proprietære OSer sh
leveres ofte enten af en POSIX-kompatibel ksh88
som ligesom dash
ikke implementerer bashismer. Afhængigt af hvad din PATH er, vil sh
på Solaris 10 og ældre sandsynligvis være en ældre Bourne-skal, der går forud for POSIX.
Under alle omstændigheder har du sandsynligvis den samme output med din test simpelthen fordi dit script ikke brugte nogen bash
specifik kommando, mulighed eller syntaks.
Når du kører ./executable
, hvilken shell der køres, afhænger i det væsentlige af shebang skrevet i begyndelsen af .executable script. Det vil være bash
hvis shebang angiver det:
#!/bin/bash ....
Hvis der ikke er nogen shebang, og du kalder scriptet fra en POSIX-kompatibel shell skal scriptet teknisk udføres af den første sh
, der findes i PATH. Mange shell-tolke som bash
, dash
og ksh
betragter sig selv som POSIX, så det vil fortolke manuskriptet. Bemærk, at SHELL
miljøvariablen ikke bruges her.
Kommentarer
- Jeg kiggede rundt i
/bin
og jeg fandt ud af, atsh
er et symbolsk link tildash
snarere endbash
. Så hvordan kørte de det samme? Det kørte ' ikke rigtig nogen bash-script-kommandoer, bare terminalkommandoer for at bruge andre pakker ' -værktøjer. - Hvis dit shell-script bare fortløbende ringer til andre kommandoer, vil enhver shell-tolk køre det med det samme resultat. Intet uventet her.
- Dette er ikke ' t relateret til spørgsmålet, men hvad er præcis forskellen mellem
bash
ogdash
? - Begge bruger Bourne-shell-syntaksen. Som jeg skrev i mit svar er
dash
en ren implementering af POSIX-skalstandarden. På den anden side erbash
en skal med et stort antal udvidelser og ikke-standardfunktioner, nogle inspireret afksh
,ksh93
og andre skaller og nogle bash-specifikke, kendt som bashismer. Der er et værktøj, der hedder checkbashisms, der hjælper med at identificere alt, hvad der ikke er strengt bærbart i et givet shell-script.
Svar
Ja det kunne være, men det behøver ikke være. De to skaller er ikke de samme, men det grundlæggende er kompatibelt. Se dette indlæg for flere detaljer.
Du kan bruge følgende linje i et script til at kontrollere den tolk, der bruges:
ps h -p $$ -o args="" | cut -f1 -d" "
Du kan eksplicit angive den shell, der skal bruges, når scriptet udføres direkte med sheebang
-linjen:
#!/bin/sh
eller
#!/bin/bash
$SHELL
variablen bruges ikke til at bestemme, hvilken shell der skal fortolke./executable
manuskript. Det ' fortæller ikke nødvendigvis, hvad den aktuelle skal er.