Wat is het verschil tussen het uitvoeren van een bash-script met sh en ./

Dezelfde vraag kan zich voordoen bij het gebruik van elk type script, niet alleen de bash-scripts. Is er een groot verschil tussen het uitvoeren van een script via de interpreter en het rechtstreeks uitvoeren van een script?

Nog een mysterie dat we zullen onthullen in dit interessante bericht van Let's Use Linux (uL).


Als je een script uitvoert door de bestandsnaam van het script door te geven aan een interpreter (sh, python, perl, etc.), voer je feitelijk de interpreter uit, waarbij je het programma dat je wilt uitvoeren als argument doorgeeft. We voeren bijvoorbeeld de sh-interpreter uit door hem het miscript.sh-argument door te geven.

sh mijnscript.sh

Als u het script zelf uitvoert, belt het systeem de tolk die het nodig heeft en, ja, het voert het script uit en geeft het als argument door aan de tolk, maar dit alles automatisch en zonder dat de gebruiker die het script heeft uitgevoerd het weet.

./mijnscript.sh

Om een ​​script zelf uit te voeren, moet aan 2 voorwaarden worden voldaan:

1) het script moet een "bangline" bevatten. Dit is de eerste regel van een script, die moet beginnen met de tekens #! en dat je het pad moet specificeren waar de tolk zich bevindt. Het is belangrijk op te merken dat deze voorwaarde geldt voor elk type script (python, perl, etc.), niet alleen voor die van bash.

Ons script zou bijvoorbeeld het volgende als eerste regel moeten bevatten:

#! / Bin / bash

2) het bestand moet uitvoeringsrechten hebben:

Om uitvoeringsrechten aan ons script te verlenen, moeten we schrijven:

chmod a + x miscript.sh

Klaar, voer het nu zo uit:

./mijnscript.sh

Of door het script naar een "speciaal" pad te kopiëren waarmee het gemakkelijk kan worden aangeroepen. We kunnen het bijvoorbeeld naar / usr / sbin kopiëren en het overal vandaan uitvoeren zonder het volledige pad op te nemen waar het zich bevindt:

We kopiëren:

sudo cp miscript.sh / usr / sbin / miscript

We voeren uit:

opschrift

Zoals je kunt zien, lijkt wat er achter de schermen gebeurt in beide gevallen erg op elkaar. Door echter een "bangline" op te nemen, zullen uw scripts veel gemakkelijker te distribueren zijn, aangezien gebruikers het pad niet hoeven te onthouden waar de nodige tolken zich bevinden om ze te kunnen uitvoeren. Conclusie: het is eigenlijk een kwestie van comfort.


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   Oswaldo Villarroel zei

    Ik ben het met je eens Erpower, zowel de versie van de interpreter als het pad zijn variabel en niet constant, zeker als men bedenkt dat GNU / Linux-distributies niet de enige zijn die Bash gebruiken (er zijn ook: freeBSD, OpenSolaris, Mac) en veel van hen hebben verschillende configuraties of routes.

    Het belangrijkste is om te weten dat je de flexibiliteit hebt (zoals je al zei) om te spelen met de oproep naar het script, hetzij met ./ of met sh (of python ... enz.)

  2.   he_who_knows@gmail.com zei

    Bash is een computerprogramma dat tot taak heeft bevelen te interpreteren.

    Het is gebaseerd op de Unix-shell en is POSIX-compatibel.

    in plaats daarvan is sh een computerprogramma waarvan de functie is om orders te interpreteren.
    Bevat functies zoals procesbesturing, omleiding
    invoer / uitvoer, bestandslijst en lezen, bescherming,
    communicatie en een commandotaal voor het schrijven van programma's door
    batches of scripts. Het was de tolk die in de eerste versies van Unix werd gebruikt en het werd de facto een standaard.

  3.   Diana C. zei

    Hallo, ik ben een beginner in het gebruik van scripts en ik zou graag willen weten of iemand me kan helpen met een probleem dat ik heb:

    Ik beheer een programma dat de opname van verschillende initiële gegevens via de console vereist en ik ontdekte dat het via een script mogelijk is om het programma uit te voeren met de initiële gegevens, zodat ik het niet steeds opnieuw hoef te schrijven wanneer ik het programma moet uitvoeren.

    Ik weet niet hoe ik het moet doen, dus als iemand me hiermee kan helpen, zal ik je erg dankbaar zijn.

  4.   Laten we Linux gebruiken zei

    Kijk, het hangt af van de programmeertaal waarin u het script schrijft. Wat u in ieder geval nodig heeft, is:

    1) Als u wilt dat de gebruiker die gegevens moet invoeren wanneer het script wordt uitgevoerd, is de meest gebruikelijke procedure dat een variabele de waarden gebruikt die in de invoer zijn ingevoerd.

    2) Als de waarden altijd hetzelfde zijn, kunt u constanten gebruiken.

    3) Een andere optie is de mogelijkheid dat uw script parameters kan aannemen.

    Proost! Paul.

  5.   Laten we Linux gebruiken zei

    Het is interessant wat je noemt. Het wordt van de 2 vormen genoemd: shebang-lijn of direct bang-lijn. Ik geef je de informatie: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Proost! Paul.

  6.   @lomellamomario zei

    Interessant, ik was nooit stilgestaan ​​bij dat detail. Het zou interessant zijn om meer artikelen te zien over het retoucheren van consoler, waaronder de beroemde hercompilatie van de kernel om de onnodige kilo's code te verwijderen die er alleen zijn voor compatibiliteit en om de systeemsnelheid te verbeteren.

  7.   Laten we Linux gebruiken zei

    OKE. Ik zal het onthouden.
    Proost! Paul.

  8.   Laten we Linux gebruiken zei

    Ik ben blij dat het heeft gewerkt. Ik probeer altijd dingen te posten waarvan ik denk dat ze interessant en praktisch kunnen zijn.
    Een knuffel! Paul.

  9.   Felix Manuel Brito Amarante zei

    Elke programmeur met goede gewoonten voegt een "bangline" toe aan de eerste regel code. In Python vergeet ik nooit de codering en de bangline.
    #! / usr / bin / python2.7
    # *. * codering = utf-8 *. *

  10.   diex02 zei

    Uitstekend, hopelijk kunt u meer informatie over de opdrachtregel publiceren, vooral als het gaat om compileren of installeren vanuit bronbestanden (tar.gz, enz.)

  11.   Joe di Castro zei

    Ik had nog nooit gehoord van "bangline", ik heb het altijd gekend als Shebang

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

    groeten

  12.   Jonathan Fernandez zei

    interessante opmerking ... bedankt!

  13.   eM Zeg eM zei

    Hoe interessant, ik verklaar mezelf totaal onwetend in programmeren en alles wat met script te maken heeft, ik had geen idee hoe het werkt, maar ik heb gemerkt dat sommigen die koptekst hebben.

  14.   Mario raimondi zei

    Een verduidelijking die mij is overkomen heeft te maken met dit bericht: ik wilde een adobe air-gadget installeren (een poker odds calculator). Wat het Adobe Air-installatieprogramma doet, is het corresponderende script uitvoeren met "su" maar in de vorm ./ en je om het root-wachtwoord vragen. Omdat het script geen uitvoeringsrechten had, werd de toestemming geweigerd, de oplossing: voer het script uit met sh als je de rechten niet wilt wijzigen (sneller dan naar de map tmp chmod en zo). Daar wordt het script uitgevoerd, het roept het Adobe-installatieprogramma aan en nog een vlinderding.

  15.   ero-sennine zei

    Zeer interessant artikel! Bedankt dat je me hebt geholpen wat meer te leren over de console. Eens kijken of u artikelen als deze ^^ blijft publiceren.
    Ga zo door, dit is zonder twijfel mijn favoriete blog !!

  16.   Ermacht zei

    Opgemerkt moet worden dat er verschillen kunnen zijn tussen de versies van de tolk die worden gebruikt. Door het script rechtstreeks volgens de shebang uit te voeren, is er geen manier om aan te geven welke versie van de interpreter moet worden gebruikt, wat misschien nodig is. Als u in plaats daarvan de interpreter uitvoert en het script als parameter doorgeeft, weet u welke versie ervan wordt uitgevoerd.

    Bijvoorbeeld, in Python, als de shebang #! / Usr / bin / python2.4 is, zal het programma anders worden uitgevoerd dan als het #! / Usr / bin / python2.6 is of als het #! / Usr / bin / python is (wat meestal een symbolische link is naar de versie van Python die standaard is geïnstalleerd en geconfigureerd). Dit komt omdat Python 2.6 nieuwe functionaliteit heeft die niet bestond in Python 2.4, dus het schrijven van een script dat die functionaliteit gebruikt en een #! / Usr / bin / python shebang aangeeft, zal mislukken als het systeem alleen Python 2.4 heeft geïnstalleerd. In plaats daarvan kun je het script altijd dwingen om te draaien met de versie van python die je wilt door het te starten met "python2.4 /path/al/script.py" of "python2.6 /path/al/script.py /

    Voor shell-scripts zijn er ook verschillen tussen de shells die u gebruikt, dus het gebruik van #! / Bin / sh en #! / Bin / bash kan verschillende resultaten hebben, afhankelijk van het script. Als je een script schrijft met functies die alleen in bash bestaan, maar een shebang #! / Bin / sh aangeeft, zal je script waarschijnlijk op Linux werken (op de meeste distributies is / bin / sh een symbolische link naar bash) maar het zal waarschijnlijk mislukken in andere UNIX-systemen waar bash niet is geïnstalleerd of waar / bin / sh geen symbolische link naar / bin / bash is.

    Ook gerelateerd aan draagbaarheid, moet er rekening mee worden gehouden dat het pad dat in de shebang wordt aangegeven absoluut is, en dat er momenten zijn waarop de tolken op andere plaatsen zijn geïnstalleerd. Het is bijvoorbeeld gebruikelijk om de python-interpreter te installeren in / usr / local / bin / python als je Python hebt gedownload en gecompileerd in plaats van een pakket uit je distributie te gebruiken. Als je shebang #! / Usr / bin / python is, werkt het script niet op die systemen. Om deze problemen te vermijden, kunt u als een shebang "#! / Usr / bin / env python" (of "#! / Usr / bin / env sh") gebruiken zoals uitgelegd in http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Laten we Linux gebruiken zei

    Bedankt Jonathan! Goed om je reactie te zien!
    Proost! Paul.

  18.   antonio zei

    Nergens doet wat ik wil weten, of ik weet tenminste niet hoe ik het in de zoekmachine moet plaatsen, ik wil een script maken dat om een ​​reden xX het commando aptitude of «su» uitvoert (het is slechts een voorbeeld maar er zijn de 2 gevallen die ik kan bedenken) en in het geval van aanleg vraagt ​​het me soms om "yon" in te voeren of in de "su" wordt me om het wachtwoord gevraagd ... Ik zou graag willen dat het script die selecteert opties automatisch door een parameter door te geven of door een methode te gebruiken die hij niet kent .... Bedankt voor de aandacht

    1.    laten we linux gebruiken zei

      Hallo Antonio! Als het uw probleem is om het wachtwoord in te voeren, denk ik niet dat er een oplossing is. Juist omdat het een beveiligingsmaatregel is, zodat niet iedereen een programma kan installeren.
      Wat betreft aanleg en ja zeggen, ik denk dat het kan worden opgelost. Ik herinner me op dit moment niet de exacte parameter die ik moet gebruiken, maar kom erachter in de man-pagina's. Open een terminal en voer het commando in: man aptitude.
      Knuffel! Paul.

  19.   David M.M. zei

    Zeer goede post.
    Ik vond het vooral leuk -in deze post- dat de vraag / twijfel die opkomt heel duidelijk en beknopt wordt beantwoord.