Hva er forskjellen mellom å kjøre et bash-skript ved hjelp av sh og ./

Det samme spørsmålet kan oppstå når du bruker hvilken som helst type skript, ikke bare de bash. Er det en stor forskjell mellom å kjøre et skript gjennom tolken og kjøre det direkte?

Et mysterium til som vi vil avsløre i dette interessante innlegget fra Let's Use Linux (uL).


Når du kjører et skript ved å sende skriptets filnavn til en tolk (sh, python, perl, etc.), utfører du faktisk tolk, og sender programmet du vil utføre som et argument. For eksempel kjører vi sh-tolken ved å sende den argumentet miscript.sh.

sh feilskrift.sh

Hvis du kjører skriptet av seg selv, vil systemet kalle tolk det trenger, og ja, det vil utføre skriptet, og sende det som et argument til tolk, men alt automatisk og uten at brukeren som utførte skriptet, visste det.

./myscript.sh

For å kunne kjøre et skript alene må to betingelser være oppfylt:

1) skriptet må inneholde en "bang line". Dette er den første linjen i et skript, som må begynne med tegnene #! og at du må spesifisere banen der tolken befinner seg. Det er viktig å merke seg at denne tilstanden gjelder for alle typer skript (python, perl, etc.), ikke bare de fra bash.

Dermed skal for eksempel skriptet vårt inneholde følgende som første linje:

#! / Bin / bash

2) filen må ha utøvende tillatelser:

For å gi utførelsestillatelser til skriptet vårt, må vi skrive:

chmod a + x miscript.sh

Klar, nå er det bare å kjøre det slik:

./myscript.sh

Eller ved å kopiere skriptet til en "spesiell" bane som gjør det enkelt å påkalle det. For eksempel kan vi kopiere den til / usr / sbin og kjøre den hvor som helst uten å inkludere hele banen der den ligger:

Vi kopierer:

sudo cp miscript.sh / usr / sbin / miscript

Vi utfører:

feilskrift

Som du kan se, er det som skjer bak kulissene i realiteten veldig likt i begge tilfeller. Imidlertid, ved å inkludere en "bang line", vil skriptene dine være mye lettere å distribuere, siden brukere ikke trenger å huske banen der de nødvendige tolkene er plassert for å kunne utføre dem. Konklusjon: det er i utgangspunktet et spørsmål om komfort.


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   Oswaldo Villarroel sa

    Jeg er enig med deg Erpower, både versjonen av tolken og dens bane er variabel og ikke konstant, enda mer hvis det anses at GNU / Linux-distribusjonene ikke er de eneste som bruker Bash (det er også: freeBSD, OpenSolaris, Mac) og mange av dem har forskjellige konfigurasjoner eller ruter.

    Det viktige er å vite at du har fleksibiliteten (som du nevnte godt) til å leke med samtalen til skriptet, enten med ./ eller med sh (eller python ... osv.)

  2.   he_who_knows@gmail.com sa

    Bash er et dataprogram som har til hensikt å tolke ordrer.

    Den er basert på Unix-skallet og er POSIX-kompatibel.

    derimot er sh et dataprogram som har som funksjon å tolke ordrer.
    Inkluderer funksjoner som prosesskontroll, omdirigering
    input / output, filliste og lesing, beskyttelse,
    kommunikasjon og et kommandospråk for å skrive programmer av
    batcher eller skript. Det var tolken som ble brukt i de første versjonene av Unix, og det ble en de facto standard.

  3.   Diana C. sa

    Hei, jeg er nybegynner i bruk av skript og vil gjerne vite om noen kan hjelpe meg med et problem som jeg har:

    Jeg administrerer et program som krever inkludering av flere innledende data gjennom konsollen, og jeg fant ut at det gjennom et skript er mulig å utføre programmet med de opprinnelige dataene, for ikke å måtte skrive det om og om igjen når jeg trenger å kjøre programmet.

    Jeg vet ikke hvordan jeg gjør det, så hvis noen kan hjelpe meg med dette, vil jeg være veldig takknemlig.

  4.   La oss bruke Linux sa

    Se, det kommer an på hvilket programmeringsspråk du skriver manuset i. Imidlertid, uansett hva du trenger er:

    1) Hvis du vil at brukeren må legge inn dataene når skriptet utføres, er den vanligste prosedyren at en variabel tar verdiene som er angitt i inngangen.

    2) Hvis verdiene alltid er de samme, kan du bruke konstanter.

    3) Et annet alternativ er muligheten for at skriptet ditt kan ta parametere.

    Jubel! Paul.

  5.   La oss bruke Linux sa

    Det er interessant det du nevner. Det kalles av de to formene: shebang-linje eller direkte bang-linje. Jeg gir deg informasjonen: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Jubel! Paul.

  6.   @llomellamomario sa

    Interessant, jeg hadde aldri stoppet for å tenke på den detaljene. Det ville være interessant å se flere artikler om retusjering av konsoller, blant dem den berømte kjernekompilering for å fjerne unødvendige kilo kode som bare er der for kompatibilitet og forbedring av systemhastigheten.

  7.   La oss bruke Linux sa

    GREIT. Jeg skal huske på det.
    Jubel! Paul.

  8.   La oss bruke Linux sa

    Jeg er glad for at det fungerte. Jeg prøver alltid å legge ut ting som jeg tror kan være interessante og praktiske.
    En klem! Paul.

  9.   Felix Manuel Brito Amarante sa

    Hver programmerer med gode vaner legger til en "bang line" til den første linjen med kode. I Python glemmer jeg aldri kodingen og smelllinjen.
    #! / usr / bin / python2.7
    # *. * koding = utf-8 *. *

  10.   diex02 sa

    Utmerket, forhåpentligvis kan du publisere mer informasjon om kommandolinjen, spesielt når det gjelder å kompilere eller installere fra kildefiler (tar.gz, etc.)

  11.   joe di castro sa

    Jeg hadde aldri hørt om "bang line", jeg har alltid kjent det som Shebang

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    Hilsen

  12.   Jonathan Fernandez sa

    interessant merknad ... takk!

  13.   eM Si eM sa

    Hvor interessant, jeg erklærer meg totalt ignorant i programmering og alt relatert til manus, jeg hadde ingen anelse om hvordan det fungerer, men jeg har lagt merke til at noen har den overskriften.

  14.   Mario raimondi sa

    En avklaring som skjedde med meg som har å gjøre med denne oppføringen: Jeg ønsket å installere en adobe air-gadget (en pokerodds kalkulator). Hva adobe air installer gjør, er å kjøre det tilsvarende skriptet med "su", men i form ./ ber deg om rotpassordet. Siden skriptet ikke hadde utførelsestillatelser, kastet det tillatelse nektet, løsningen: kjør skriptet med sh hvis du ikke vil endre tillatelsene (raskere enn å gå til tmp chmod-mappen og alt det). Der kjører skriptet, det kaller Adobe-installasjonsprogrammet og noe annet sommerfugl.

  15.   ero-sennin sa

    Veldig interessant artikkel! Takk for at du hjelper meg å vite litt mer om konsollen. La oss se om du fortsetter å publisere artikler som disse ^^.
    Fortsett, dette er uten tvil favorittbloggen min !!

  16.   erpower sa

    Husk at det kan være forskjeller mellom versjonene av tolk som brukes. Å kjøre skriptet direkte i henhold til shebang er det ingen måte å indikere hvilken versjon av tolk du skal bruke, noe som kan være nødvendig. Hvis du i stedet kjører tolken og sender skriptet som en parameter, vet du hvilken versjon av den som kjører.

    For eksempel i Python, hvis shebang er #! / Usr / bin / python2.4, vil programmet kjøre annerledes enn om det er #! / Usr / bin / python2.6, eller hvis det er #! / Usr / bin / python (som vanligvis er en symbolsk lenke til versjonen av Python som er installert og konfigurert som standard). Dette skjer fordi Python 2.6 har ny funksjonalitet som ikke eksisterte i Python 2.4, så å skrive et skript som bruker den funksjonaliteten som indikerer en #! / Usr / bin / python shebang vil mislykkes hvis systemet bare har python 2.4 installert. I stedet kan du alltid tvinge skriptet til å kjøre med den versjonen av python du ønsker, ved å starte den med "python2.4 /path/al/script.py" eller "python2.6 /path/al/script.py/

    For skallskript er det også forskjeller mellom skallene du bruker, så bruk av #! / Bin / sh og #! / Bin / bash kan ha forskjellige resultater, avhengig av skriptet. Hvis du skriver et skript ved hjelp av funksjoner som bare finnes i bash, men spesifiserer en #! / Bin / sh shebang, vil skriptet ditt sannsynligvis fungere på Linux (på de fleste distribusjoner er bin / sh en symbolsk lenke til bash), men det vil sannsynligvis mislykkes i andre UNIX-er der bash ikke er installert eller der / bin / sh ikke er en symbolsk lenke til / bin / bash.

    Også relatert til bærbarhet, må det tas i betraktning at banen som er angitt i shebang er absolutt, og at det er tider når tolkerne er installert andre steder. For eksempel er det vanlig å ha pythontolken installert i / usr / local / bin / python hvis du har lastet ned og kompilert Python i stedet for å bruke en pakke fra distribusjonen din. Hvis din shebang er #! / Usr / bin / python, fungerer ikke skriptet på disse systemene. For å prøve å unngå disse problemene, kan du bruke som shebang "#! / Usr / bin / env python" (eller "#! / Usr / bin / env sh") som forklart i http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   La oss bruke Linux sa

    Takk Jonathan! Godt å se deg kommentere!
    Jubel! Paul.

  18.   antonio sa

    Ingen steder gjør det jeg vil vite, eller i det minste ikke vet hvordan jeg skal heve det i søkemotoren, jeg vil lage et skript som av en grunn xX utfører kommandoen aptitude eller «su» (det er bare et eksempel, men det er de 2 tilfellene som Jeg kan tenke meg) og når det gjelder egnethet, ber det meg om å skrive inn "yon" eller i "su", det ber meg om passordet ... Jeg vil at skriptet skal velge disse alternativene automatisk enten ved å sende en parameter eller bruke en metode som den ikke vet ... . Takk for oppmerksomheten

    1.    la oss bruke linux sa

      Hei Antonio! Hvis problemet ditt er å måtte skrive inn passordet, tror jeg ikke det er en løsning. Nettopp fordi det er et sikkerhetstiltak, slik at ikke alle kan installere et program.
      Når det gjelder dyktighet og å måtte sette ja, tror jeg det kan løses. Jeg husker ikke for øyeblikket den eksakte parameteren jeg skal bruke, men bare finn ut på mansidene. Åpne en terminal og skriv inn kommandoen: man aptitude.
      Klem! Paul.

  19.   David M.M. sa

    Veldig bra innlegg.
    Jeg likte spesielt - i dette innlegget - at spørsmålet / tvilen som oppstår blir besvart veldig tydelig og kortfattet.