Hvad er forskellen mellem at køre et bash-script ved hjælp af sh og ./

Det samme spørgsmål kan opstå, når du bruger enhver form for script, ikke kun de bash. Er der en stor forskel mellem at køre et script gennem tolken og køre det direkte?

Endnu et mysterium, som vi vil afsløre i dette interessante indlæg fra Let's Use Linux (uL).


Når du kører et script ved at sende scriptets filnavn til en tolk (sh, python, perl osv.), Udfører du faktisk tolken og sender det program, du vil udføre, som et argument. For eksempel kører vi sh-tolken ved at give den miscript.sh argumentet.

sh myscript.sh

Hvis du kører scriptet af sig selv, kalder systemet tolken, som det har brug for, og ja, det vil udføre scriptet, der videregiver det som et argument til tolken, men alt automatisk og uden at brugeren, der udførte scriptet, vidste om det.

./myscript.sh

For at køre et script i sig selv skal to betingelser være opfyldt:

1) scriptet skal indeholde en "bang line". Dette er den første linje i et script, som skal begynde med tegnene #! og at du skal angive stien, hvor tolken er placeret. Det er vigtigt at bemærke, at denne betingelse gælder for enhver type script (python, perl osv.), Ikke kun dem fra bash.

Så for eksempel skal vores script indeholde følgende som første linje:

#! / Bin / bash

2) filen skal have eksekveringstilladelser:

For at give eksekveringstilladelser til vores script skal vi skrive:

chmod a + x miscript.sh

Klar, kør det bare sådan her:

./myscript.sh

Eller ved at kopiere scriptet til en "speciel" sti, der gør det let at påberåbe det. For eksempel kan vi kopiere det til / usr / sbin og køre det hvor som helst uden at inkludere den fulde sti, hvor det er placeret:

Vi kopierer:

sudo cp miscript.sh / usr / sbin / miscript

Vi udfører:

misskrift

Som du kan se, er det, der sker bag kulisserne, i realiteten meget ens i begge tilfælde. Ved at inkludere en "bang line" vil dine scripts imidlertid være meget lettere at distribuere, da brugerne ikke behøver at huske stien, hvor de nødvendige tolke er placeret for at kunne udføre dem. Konklusion: det er dybest set et spørgsmål om komfort.


Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   Oswaldo Villarroel sagde han

    Jeg er enig med dig Erpower, både versionen af ​​tolk og dens sti er variabel og ikke konstant, endnu mere, hvis det anses for, at GNU / Linux-distributioner ikke er de eneste, der bruger Bash (der er også: freeBSD, OpenSolaris, Mac) og mange af dem har forskellige konfigurationer eller ruter.

    Det vigtige er at vide, at du har fleksibiliteten (som du nævnte godt) til at lege med kaldet til scriptet, enten med ./ eller med sh (eller python ... osv.)

  2.   he_who_knows@gmail.com sagde han

    Bash er et computerprogram, hvis funktion er at fortolke ordrer.

    Den er baseret på Unix-skalen og er POSIX-kompatibel.

    på den anden side er sh et computerprogram, hvis funktion er at fortolke ordrer.
    Indeholder funktioner som proceskontrol, omdirigering
    input / output, filliste og læsning, beskyttelse,
    kommunikation og et kommandosprog til at skrive programmer af
    batches eller scripts. Det var tolken, der blev brugt i de første versioner af Unix, og det blev en de facto-standard.

  3.   Diana C. sagde han

    Hej, jeg er nybegynder i brugen af ​​scripts, og jeg vil gerne vide, om nogen kan hjælpe mig med et problem, jeg har:

    Jeg administrerer et program, der kræver inkludering af flere indledende data gennem konsollen, og jeg fandt ud af, at det via et script er muligt at udføre programmet med de oprindelige data, for ikke at skulle skrive det igen og igen, når jeg har brug for at udføre programmet.

    Jeg ved ikke, hvordan man gør det, så hvis nogen kan hjælpe mig med dette, vil jeg være meget taknemmelig.

  4.   Lad os bruge Linux sagde han

    Se, det afhænger af hvilket programmeringssprog du skriver scriptet på. Under alle omstændigheder er det, du har brug for:

    1) Hvis du vil have, at brugeren skal indtaste disse data, hver gang scriptet udføres, er den mest almindelige procedure, at en variabel tager de værdier, der er indtastet i input.

    2) Hvis værdierne altid er de samme, kan du bruge konstanter.

    3) En anden mulighed er muligheden for, at dit script kan tage parametre.

    Skål! Paul.

  5.   Lad os bruge Linux sagde han

    Det er interessant, hvad du nævner. Det kaldes to måder: shebang-linje eller direkte bang-linje. Jeg sender dig dataene: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Skål! Paul.

  6.   @llomellamomario sagde han

    Interessant, jeg havde aldrig stoppet med at tænke på den detalje. Det ville være interessant at se flere artikler om retouchering af konsoler, blandt dem den berømte kernekompilering for at fjerne de unødvendige kilo kode, der kun er der for kompatibilitet og forbedring af systemhastigheden.

  7.   Lad os bruge Linux sagde han

    OKAY. Jeg skal huske det.
    Skål! Paul.

  8.   Lad os bruge Linux sagde han

    Jeg er glad for, at det fungerede. Jeg prøver altid at poste ting, som jeg synes kan være interessante og praktiske.
    Et kram! Paul.

  9.   Felix Manuel Brito Amarante sagde han

    Hver programmør med gode vaner tilføjer en "bang line" til den første kodelinje. I Python glemmer jeg aldrig kodningen og bang line.
    #! / usr / bin / python2.7
    # *. * kodning = utf-8 *. *

  10.   diex02 sagde han

    Fremragende, forhåbentlig kan du offentliggøre mere information om kommandolinjen, især når det kommer til at kompilere eller installere fra kildefiler (tar.gz osv.)

  11.   joe di castro sagde han

    Jeg havde aldrig hørt om "bang line", jeg har altid kendt det som Shebang

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

    hilsen

  12.   Jonathan Fernandez sagde han

    interessant note ... tak!

  13.   eM Sig eM sagde han

    Hvor interessant, jeg erklærer mig selv totalt uvidende om programmering og alt relateret til script, jeg havde ingen idé om, hvordan det fungerer, men jeg har bemærket, at nogle har den overskrift.

  14.   Mario raimondi sagde han

    En afklaring, der skete med mig, der har at gøre med dette indlæg: Jeg ville installere en adobe air-gadget (en poker odds-lommeregner). Hvad adobe air installer gør er at køre det tilsvarende script med "su" men i form ./ beder dig om root-adgangskoden. Da scriptet ikke havde eksekveringstilladelser, kastede det tilladelse nægtet, løsningen: kør scriptet med sh, hvis du ikke vil ændre tilladelserne (hurtigere end at gå til tmp chmod-mappen og alt det der). Der udføres scriptet, det kalder Adobe installationsprogrammet og en anden sommerfugl ting.

  15.   ero-sennin sagde han

    Meget interessant artikel! Tak, fordi du hjalp mig med at lære lidt mere om konsollen. Lad os se, om du fortsætter med at offentliggøre artikler som disse ^^.
    Fortsæt det, dette er uden tvivl min yndlingsblog !!

  16.   erpower sagde han

    Det skal bemærkes, at der kan være forskelle mellem de versioner af tolk, der bruges. At køre scriptet direkte i henhold til shebang er der ingen måde at angive, hvilken version af tolk der skal bruges, hvilket kan være nødvendigt. Hvis du i stedet kører tolken og sender scriptet som en parameter, ved du hvilken version af det der kører.

    For eksempel i Python, hvis shebang er #! / Usr / bin / python2.4, udføres programmet forskelligt, end hvis det er #! / Usr / bin / python2.6, eller hvis det er #! / Usr / bin / python (som normalt er et symbolsk link til den version af Python, der er installeret og konfigureret som standard). Dette sker, fordi Python 2.6 har ny funktionalitet, der ikke eksisterede i Python 2.4, så skrivning af et script, der bruger den funktionalitet, der angiver en #! / Usr / bin / python shebang, mislykkes, hvis systemet kun har python 2.4 installeret. I stedet kan du altid tvinge scriptet til at køre med den ønskede version af python ved at starte det med "python2.4 /path/al/script.py" eller "python2.6 /path/al/script.py /

    For shell-scripts er der også forskelle mellem de skaller, du bruger, så brug af #! / Bin / sh og #! / Bin / bash kan have forskellige resultater afhængigt af scriptet. Hvis du skriver et script ved hjælp af funktioner, der kun findes i bash, men angiver en shebang #! / Bin / sh, fungerer dit script sandsynligvis på Linux (på de fleste distributioner er bin / sh et symbolsk link til bash), men det vil sandsynligvis mislykkes i andre UNIX'er, hvor bash ikke er installeret, eller hvor / bin / sh ikke er et symbolsk link til / bin / bash.

    Også relateret til bærbarhed skal det tages i betragtning, at stien, der er angivet i shebangen, er absolut, og at der er tidspunkter, hvor tolkerne er installeret andre steder. For eksempel er det almindeligt at have pythontolken installeret i / usr / local / bin / python, hvis du har downloadet og kompileret Python i stedet for at bruge en pakke fra din distribution. Hvis din shebang er #! / Usr / bin / python, fungerer scriptet ikke på disse systemer. For at forsøge at undgå disse problemer kan du bruge som shebang "#! / Usr / bin / env python" (eller "#! / Usr / bin / env sh") som forklaret i http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Lad os bruge Linux sagde han

    Tak Jonathan! Godt at se dig kommentere!
    Skål! Paul.

  18.   antonio sagde han

    Intetsteds gør det, jeg vil vide, eller i det mindste ikke ved jeg, hvordan man hæver det i søgemaskinen, jeg vil oprette et script, der af en grund xX udfører kommandoen aptitude eller «su» (det er kun et eksempel, men det er de 2 tilfælde, som Jeg kan tænke på) og i tilfælde af egnethed beder det mig nogle gange om at indtaste "yon" eller i "su" beder det mig om adgangskoden ... Jeg vil gerne have, at scriptet vælger disse muligheder automatisk enten ved at sende en parameter eller bruge en metode, som den ikke kender ... . Tak for opmærksomheden

    1.    lad os bruge linux sagde han

      Hej Antonio! Hvis dit problem er at skulle indtaste adgangskoden, tror jeg ikke, der er en løsning. Præcis fordi det er en sikkerhedsforanstaltning, så ikke alle kan installere et program.
      Med hensyn til kapacitet og at skulle sætte ja, tror jeg, det kan løses. Jeg kan ikke huske på dette tidspunkt den nøjagtige parameter, der skal bruges, men find ud af det på mandsiderne. Åbn en terminal, og indtast kommandoen: man aptitude.
      Kram! Paul.

  19.   David M.M. sagde han

    Meget godt indlæg.
    Jeg kunne især godt lide - i dette indlæg - at spørgsmålet / tvivlen, der opstår, besvares meget klart og kortfattet.