Kakšna je razlika med izvajanjem skripta bash z uporabo sh in ./

To isto vprašanje se lahko pojavi pri uporabi katere koli vrste skriptov, ne samo bash. Ali obstaja večja razlika med izvajanjem skripta prek tolmača in njegovim neposrednim zagonom?

Še ena skrivnost, ki jo bomo razkrili v tem zanimivem prispevku Uporabljajmo Linux (uL).


Ko zaženete skript tako, da njegovo ime datoteke posredujete tolmaču (sh, python, perl itd.), Dejansko izvajate tolmač in kot argument posredujete program, ki ga želite izvesti. Na primer, zaženemo tolmač sh, tako da mu posredujemo argument miscript.sh.

sh myscript.sh

Če skript zaženete sami, bo sistem poklical tolmača, ki ga potrebuje, nato pa bo izvedel skript in ga posredoval kot argument tolmaču, vendar vse samodejno in brez vedenja uporabnika, ki je skript izvedel.

./myscript.sh

Če želite skript zagnati sam, morata biti izpolnjena 2 pogoja:

1) skript mora vsebovati "vrstico". To je prva vrstica skripta, ki se mora začeti z znaki #! in da morate določiti pot, kjer je tolmač. Pomembno je omeniti, da ta pogoj velja za vse vrste skriptov (python, perl itd.), Ne le za tiste iz bash.

Tako mora na primer naš skript kot prva vrstica vsebovati naslednje:

#! / Bin / bash

2) datoteka mora imeti dovoljenja za izvajanje:

Za dodelitev dovoljenj za izvajanje našega skripta moramo napisati:

chmod napaka x + x.sh

Pripravljen, zdaj ga zaženite takole:

./myscript.sh

Ali s kopiranjem skripta na "posebno" pot, ki omogoča enostavno klicanje. Lahko ga na primer prekopiramo v / usr / sbin in ga zaženemo od koder koli, ne da bi vključili celotno pot, kjer se nahaja:

Kopiramo:

sudo cp miscript.sh / usr / sbin / miscript

Izvajamo:

napako

Kot lahko vidite, je v resnici dogajanje v zakulisju v obeh primerih zelo podobno. Če pa vključite "bang line", bo vaše skripte veliko lažje distribuirati, saj si uporabniki ne bodo morali zapomniti poti, na kateri so potrebni tolmači, da jih bodo lahko izvedli. Zaključek: v bistvu gre za udobje.


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.

  1.   Oswaldo Villarroel je dejal

    Strinjam se z vami, Erpower, različica tolmača in njegova pot sta spremenljivi in ​​ne konstantni, še bolj, če se šteje, da distribucije GNU / Linux niso edine, ki uporabljajo Bash (obstajajo tudi: freeBSD, OpenSolaris, Mac) in mnogi imajo različne konfiguracije ali poti.

    Pomembno je vedeti, da imate prilagodljivost (kot ste že dobro omenili), da se igrate s klicem skripta, bodisi z ./ bodisi s sh (ali python ... itd.)

  2.   on_who_knows@gmail.com je dejal

    Bash je računalniški program, katerega naloga je razlagati naročila.

    Temelji na lupini Unix in je skladen s POSIX-om.

    namesto tega je sh računalniški program, katerega naloga je razlagati ukaze.
    Vključuje funkcije, kot so nadzor procesa, preusmeritev
    vhod / izhod, seznam datotek in branje, zaščita,
    komunikacije in ukazni jezik za pisanje programov
    paketov ali skript. Bil je tolmač, ki se je uporabljal v prvih različicah Unixa in je dejansko postal standard.

  3.   Diana C. je dejal

    Pozdravljeni, jaz sem začetnik uporabe skriptov in rad bi vedel, če mi lahko kdo pomaga pri težavi, ki jo imam:

    Upravljam program, ki zahteva vključitev več začetnih podatkov skozi konzolo in ugotovil sem, da je prek skripta mogoče zagnati program z začetnimi podatki, tako da ga ne bi bilo treba vedno znova pisati, ko moram zagnati program.

    Ne vem, kako naj to storim, zato bom, če mi bo kdo pri tem pomagal, zelo hvaležna.

  4.   Uporabimo Linux je dejal

    Glejte, odvisno od tega, v katerem programskem jeziku pišete skript. Vendar v vsakem primeru potrebujete:

    1) Če želite, da mora uporabnik te podatke vnesti vsakič, ko se skript izvede, je najpogostejši postopek, da spremenljivka sprejme vrednosti, vnesene v vnos.

    2) Če so vrednosti vedno enake, lahko uporabite konstante.

    3) Druga možnost je možnost, da lahko vaš skript zajema parametre.

    Na zdravje! Paul.

  5.   Uporabimo Linux je dejal

    Zanimivo je to, kar omenjate. Imenuje se iz dveh oblik: shebang line ali neposredno bang line. Dajem vam informacije: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Na zdravje! Paul.

  6.   @llomellamomario je dejal

    Zanimivo, nikoli nisem nehal razmišljati o tej podrobnosti. Zanimivo bi bilo videti več člankov o retuširanju konzole, med njimi tudi znana rekompilacija jedra, da se odstranijo nepotrebni kilogrami kode, ki so na voljo samo za združljivost in izboljšanje sistemske hitrosti.

  7.   Uporabimo Linux je dejal

    V REDU. To bom imel v mislih.
    Na zdravje! Paul.

  8.   Uporabimo Linux je dejal

    Vesel sem, da je uspelo. Vedno poskušam objaviti stvari, ki se mi zdijo zanimive in praktične.
    Objem! Paul.

  9.   Felix Manuel Brito Amarante je dejal

    Vsak programer z dobrimi navadami v prvo vrstico kode doda "vrvico". V Pythonu nikoli ne pozabim na kodiranje in vrstico bang.
    #! / usr / bin / python2.7
    # *. * kodiranje = utf-8 *. *

  10.   diex02 je dejal

    Odlično, upam, da lahko objavite več informacij o ukazni vrstici, še posebej, ko gre za prevajanje ali namestitev iz izvornih datotek (tar.gz itd.)

  11.   Joe di Castro je dejal

    Nikoli nisem slišal za "bang line", od nekdaj sem ga poznal kot Shebang

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

    pozdrav

  12.   Jonathan Fernandez je dejal

    zanimiva opomba ... hvala!

  13.   eM Reci eM je dejal

    Kako zanimivo, razglašam se za popolnoma nevednega v programiranju in vsem, kar je povezano s skriptom, nisem vedel, kako to deluje, vendar sem opazil, da imajo nekateri to glavo.

  14.   Mario raimondi je dejal

    Pojasnilo, ki se mi je zgodilo v zvezi s tem vnosom: hotel sem namestiti pripomoček adobe air (kalkulator poker kvote). Kaj počne Adobe installer air, zažene ustrezen skript z "su", vendar v obliki ./, ki vas prosi za root geslo. Ker skript ni imel dovoljenj za izvajanje, je vrgel zavrnjeno dovoljenje, rešitev: zaženite skript s sh, če ne želite spremeniti dovoljenj (hitreje kot obisk mape tmp chmod in vse to). Tam se skript izvede, pokliče program za namestitev adobe in še eno stvar z metulji.

  15.   ero-sennin je dejal

    Zelo zanimiv članek! Hvala, ker ste mi pomagali izvedeti nekaj več o konzoli. Poglejmo, ali še naprej objavljate takšne članke ^^.
    Nadaljujte, to je nedvomno moj najljubši blog !!

  16.   Moč je dejal

    Upoštevajte, da lahko obstajajo razlike med različicami tolmača, ki se uporabljajo. Če zaženete skript neposredno v skladu s shebangom, ni mogoče navesti, katero različico tolmača uporabiti, kar bo morda potrebno. Če namesto njega zaženete tolmač in mu posredujete skript kot parameter, veste, katera različica se izvaja.

    Na primer v Pythonu, če je shebang #! / Usr / bin / python2.4, se bo program zagnal drugače, kot če je #! / Usr / bin / python2.6 ali če je #! / Usr / bin / python (kar je ponavadi simbolična povezava do različice Pythona, ki je privzeto nameščena in konfigurirana). To se zgodi, ker ima Python 2.6 novo funkcionalnost, ki v Pythonu 2.4 ni obstajala, zato pisanje skripta, ki uporablja to funkcijo, ki označuje shebang #! / Usr / bin / python, ne bo uspelo, če ima sistem nameščen samo python 2.4. Namesto tega lahko skript vedno zaženete z želeno različico pythona, tako da ga zaženete s "python2.4 /path/al/script.py" ali "python2.6 /path/al/script.py/

    Pri skriptih lupine obstajajo tudi razlike med lupinami, ki jih uporabljate, zato lahko uporaba #! / Bin / sh in #! / Bin / bash povzroči različne rezultate, odvisno od skripta. Če napišete skript z uporabo funkcij, ki obstajajo samo v bash, vendar navedete shebang #! / Bin / sh, bo vaš skript verjetno deloval v Linuxu (pri večini distribucij / bin / sh je simbolična povezava do basha), vendar verjetno ne bo uspel v drugih UNIX-ih, kjer bash ni nameščen ali kjer / bin / sh ni simbolična povezava do / bin / bash.

    V zvezi s prenosljivostjo je treba upoštevati, da je pot, ki je navedena v shebangu, absolutna, včasih pa so tolmači nameščeni na drugih mestih. Na primer, običajno je, da je v / usr / local / bin / python nameščen tolmač python, če ste Python prenesli in zbrali, namesto da bi uporabili paket iz vaše distribucije. Če je vaš shebang #! / Usr / bin / python, skript v teh sistemih ne bo deloval. Da bi se izognili tem težavam, lahko kot shebang uporabite "#! / Usr / bin / env python" (ali "#! / Usr / bin / env sh"), kot je razloženo v http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Uporabimo Linux je dejal

    Hvala Jonathan! Lepo vas je videti, da komentirate!
    Na zdravje! Paul.

  18.   Antonio je dejal

    Nikjer ne tisto, kar želim vedeti, ali vsaj ne vem, kako to dvigniti v iskalniku, želim ustvariti skript, ki iz razloga xX izvrši ukaz aptitude ali «su» (je le primer, gre za dva primera, na katera se lahko spomnim) in v primeru sposobnosti me včasih prosi, da vpišem "yon", v "su" pa geslo ... Želel bi, da skript izbere te možnosti samodejno bodisi s posredovanjem parametra bodisi z uporabo neke metode, ki je ne pozna .... Hvala za pozornost

    1.    uporabimo linux je dejal

      Pozdravljeni Antonio! Če je zaradi vaše težave treba vnesti geslo, mislim, da ni rešitve. Ravno zato, ker gre za varnostni ukrep, tako da ne more vsakdo namestiti programa.
      Glede sposobnosti in tega, da moram odgovoriti z da, mislim, da je to mogoče rešiti. V tem trenutku se ne spomnim natančnega parametra, ki bi ga uporabili, ampak preprosto poiščite na straneh z navodili. Odprite terminal in vnesite ukaz: man aptitude.
      Objem! Paul.

  19.   David M.M. je dejal

    Zelo dobra objava.
    V tem prispevku mi je bilo še posebej všeč, da se na vprašanje / dvom, ki se pojavi, odgovori zelo jasno in jedrnato.