30Jul

Når er det bedre å bruke #!/bin/ bash I stedet for #!/bin/ sh i et Shell Script?

Når du lager et nytt skallskript, vil du sørge for at det er så problemfritt som mulig, men noen ganger kan det være litt forvirrende å vite hvilken shebang som er den beste for deg å bruke. På dette notatet har dagens SuperUser Q & A-innlegg svaret på en forvirret leser spørsmål.

Dagens Spørsmål &Svar-sesjon kommer til oss med høflighet av SuperUser-en underavdeling av Stack Exchange, en fellesskapsdrevet gruppering av Q & A-nettsteder.

Spørsmålet

SuperUser leser Hendre vil vite når det er bedre å bruke #!/bin/ bash i stedet for #!/bin/ sh i shell-skript:

Når er det mer hensiktsmessig å bruke #!/bin/ bash i stedet for #!/bin/ sh i et shell script?

Når er det bedre å bruke #!/bin/ bash i stedet for #!/bin/ sh i et skalskript?

Svaret

SuperUser-bidragsgravitasjonen har svaret for oss:

Kort sagt:

  • Det finnes flere skall som implementerer en supersett av POSIX sh-spesifikasjonen. På forskjellige systemer, /bin/ sh kan være en lenke til aske, bash, dash, ksh, zsh, etc. Det vil alltid være sh-kompatibel, men aldri csh eller fisk.
  • Så lenge du holder fast i sh-funksjoner, kan du( og sannsynligvis også) bruke #!/bin/ sh og manuset skal fungere fint, uansett hvilket skall det er.
  • Hvis du begynner å bruke bash-spesifikke funksjoner( dvs. arrayer), bør du spesifikt be om bash fordi, selv om /bin/ sh allerede påberoper bash på systemet ditt, kan det ikke være på alle andres system, og manuset ditt vil ikke løpe der. Det samme gjelder for zsh og ksh, selvfølgelig.
  • Selv om skriptet kun er til personlig bruk, kan det hende du merker at enkelte operativsystemer endrer /bin/ sh under oppgraderinger. For eksempel var det på Debian det å være bash, men ble senere erstattet med den svært små dash. Skript som brukte bashisms men hadde #!/bin/ sh plutselig brøt.

Men:

  • Selv #!/bin/ bash er ikke så riktig. På forskjellige systemer kan bash leve i /usr/ bin , /usr/pkg/ bin eller /usr/local/ bin .
  • Et mer pålitelig alternativ er #!/usr/bin/ env bash , som bruker $ PATH .Selv om env-verktøyet selv ikke er strengt garantert, virker /usr/bin/ env fortsatt på flere systemer enn /bin/ bash gjør.

Har du noe å legge til forklaringen? Lyder av i kommentarene. Vil du lese flere svar fra andre tech-savvy Stack Exchange-brukere? Sjekk ut hele diskusjonstråden her.

Image Credit: Wikipedia