vad är skillnaden mellan #!/ bin / sh och #!/ bin / bash?

på Linux och andra Unix-liknande system kan du välja mellan flera skal.

skalet ansvarar inte bara för att rita din lilla prompt, men tolka dina kommandon, speciellt om du lägger in komplicerad logik som rör, villkor och så vidare.

bash är det vanligaste skalet som används som standardskal för användare av Linux-system. Det är en andlig ättling till andra skal som används genom Unix-historien. Dess namn, bash är en förkortning av Bourne-Again Shell, en hyllning till Bourne-skalet som den var utformad för att ersätta, även om den också innehåller funktioner från C-skalet och Korn-skalet.

det körs, dessa dagar, från /bin/bash – alla system med bash kommer att ha det tillgängligt här.

det är dock inte bara användare som använder skal. Skript (skalskript) behöver skal för att tolka dem. När du kör ett skalskript måste ditt system starta en skalprocess för att köra ditt skript.

problemet är att olika skal har små små inkonsekvenser mellan dem, och när det gäller att köra skript kan dessa vara ett verkligt problem. bash har en hel del skriptfunktioner som bara är unika för bash och inte för andra skal. Det här är bra, om du alltid ska använda bash för att köra dessa skript. Andra skal kan försöka antingen emulera bash eller följa POSIX-standarden, vilket bash stöder ganska bra (men lägger till egna tillägg till).

det är möjligt att ange högst upp i ett skalskript vilket skal det ska köras med med en shebang. Ett skript kan ange #!/bin/bash på den första raden, vilket innebär att skriptet alltid ska köras med bash, snarare än ett annat skal.

/ bin / sh är en körbar som representerar systemskalet. Egentligen implementeras det vanligtvis som en symbolisk länk som pekar på den körbara för vilket skal som är systemskalet. Systemskalet är typ av standardskalet som systemskript ska använda. I Linux-distributioner var det under lång tid vanligtvis en symbolisk länk till bash, så mycket att det har blivit något av en konvention att alltid länka /bin/sh till bash eller ett bash-kompatibelt skal. Under de senaste åren har Debian (och Ubuntu) beslutat att byta systemskal från bash till dash – en liknande skalbrytning med en lång tradition i Linux (ja, GNU) att använda bash för /bin/sh. Dash ses som ett lättare och mycket snabbare skal som kan vara fördelaktigt för starthastighet (och andra saker som kräver många skalskript, som paketinstallationsskript).

Dash är ganska väl kompatibel med bash, baserat på samma POSIX-standard. Det implementerar dock inte de bash-specifika tilläggen. Det finns skript som använder #!/bin/sh (systemskalet) som deras shebang, men som kräver bash-specifika tillägg. Detta anses för närvarande vara en bugg som bör åtgärdas av Debian och Ubuntu, som kräver /bin/sh för att kunna arbeta när de pekar på dash.

även om Ubuntus systemskal pekar på dash, fortsätter ditt inloggningsskal som användare att vara bash vid denna tidpunkt. Det vill säga när du loggar in på en terminalemulator var som helst i Linux kommer ditt inloggningsskal att vara bash. Hastighet drift är inte så mycket ett problem när skalet används interaktivt, och användarna är bekanta med bash (och kan ha bash specifika anpassningar i sin hemkatalog).

vad du ska använda när du skriver skript

om ditt skript endast kräver funktioner som stöds av bash, använd #!/bin/bash.

men om det är möjligt skulle det vara bra att se till att ditt skript är POSIX-kompatibelt och använda #!/bin/sh, vilket alltid, ganska tillförlitligt, pekar på det föredragna POSIX-kompatibla systemskalet i vilken installation som helst.

Lämna ett svar

Din e-postadress kommer inte publiceras.