Aký je rozdiel medzi spustením bash skriptu pomocou sh a ./

Rovnaká otázka môže vzniknúť pri použití ľubovoľného typu skriptu, nielen bash. Existuje zásadný rozdiel medzi spustením skriptu prostredníctvom tlmočníka a priamym spustením?

Ešte jedna záhada, ktorú odhalíme v tomto zaujímavom príspevku od Let's Use Linux (uL).


Keď spustíte skript tak, že názov súboru skriptu odovzdáte tlmočníkovi (sh, python, perl atď.), Skutočne vykonávate tlmočníka a program, ktorý chcete vykonať, odovzdáte ako argument. Napríklad tlmočník sh spustíme tak, že mu odovzdáme argument miscript.sh.

sh myscript.sh

Ak spustíte skript sám, systém zavolá tlmočníka, ktorého potrebuje, a potom áno, vykoná skript a predá ho ako argument tlmočníkovi, ale všetko automaticky a bez vedomia používateľa, ktorý skript vykonal.

./myscript.sh

Aby bolo možné spustiť skript sám, musia byť splnené 2 podmienky:

1) skript musí obsahovať riadok „treska“. Toto je prvý riadok skriptu, ktorý musí začínať znakmi #! a že musíte určiť cestu, kde sa nachádza tlmočník. Je dôležité si uvedomiť, že táto podmienka platí pre akýkoľvek typ skriptu (python, perl atď.), Nielen pre tie z bash.

Náš skript by mal napríklad obsahovať ako prvý riadok toto:

#! / Bin / bash

2) súbor musí mať povolenie na vykonávanie:

Aby sme nášmu skriptu mohli udeliť povolenia na vykonávanie, musíme napísať:

chmod a + x miscript.sh

Pripravené, teraz to jednoducho spustite takto:

./myscript.sh

Alebo skopírovaním skriptu na „špeciálnu“ cestu, ktorá umožňuje ľahké vyvolanie. Môžeme ho napríklad skopírovať do adresára / usr / sbin a spustiť ho odkiaľkoľvek bez toho, aby sme zahrnuli celú cestu tam, kde sa nachádza:

Kopírujeme:

sudo cp miscript.sh / usr / sbin / miscript

Vykonávame:

omyl

Ako vidíte, v skutočnosti je to, čo sa deje v zákulisí, v obidvoch prípadoch veľmi podobné. Vďaka zahrnutiu „riadku s treskom“ sa však vaše skripty budú distribuovať oveľa jednoduchšie, pretože používatelia si nebudú musieť pamätať cestu, kde sa nachádzajú potrební tlmočníci, aby ich mohli spustiť. Záver: je to v podstate otázka pohodlia.


Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Zodpovedný za údaje: Miguel Ángel Gatón
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.

  1.   Oswaldo Villarroel dijo

    Súhlasím s vami Erpower, verzia tlmočníka aj jeho cesta sú variabilné a nie konštantné, o to viac, ak sa vezme do úvahy, že distribúcie GNU / Linux nie sú jedinými, ktoré používajú Bash (sú tiež: freeBSD, OpenSolaris, Mac) a mnohé z nich majú rôzne konfigurácie alebo trasy.

    Dôležité je vedieť, že máte flexibilitu (ako ste dobre spomenuli) hrať s volaním skriptu, či už s ./ alebo s sh (alebo pythonom ... atď.)

  2.   on_who_knows@gmail.com dijo

    Bash je počítačový program, ktorého funkciou je interpretácia príkazov.

    Je založený na prostredí Unix a je kompatibilný s POSIX.

    namiesto toho sh je počítačový program, ktorého funkciou je interpretácia príkazov.
    Zahŕňa funkcie ako riadenie procesu, presmerovanie
    vstup / výstup, výpis a čítanie súborov, ochrana,
    komunikácia a príkazový jazyk na písanie programov používateľom
    dávky alebo skripty. Bol to tlmočník používaný v prvých verziách systému Unix a stal sa de facto štandardom.

  3.   Diana C. dijo

    Dobrý deň, som začiatočník v používaní skriptov a chcem vedieť, či mi niekto môže pomôcť s problémom, ktorý mám:

    Spravujem program, ktorý vyžaduje zahrnutie niekoľkých počiatočných údajov cez konzolu, a zistil som, že pomocou skriptu je možné program spustiť s počiatočnými údajmi, aby som ich nemusel písať znova a znova, keď som musíte vykonať program.

    Neviem, ako na to, takže ak mi s tým niekto pomôže, budem veľmi vďačný.

  4.   Použime Linux dijo

    Záleží na tom, v akom programovacom jazyku píšete skript. V každom prípade však potrebujete:

    1) Ak chcete, aby používateľ musel tieto údaje zadávať pri každom spustení skriptu, je najbežnejším postupom, keď premenná prevezme hodnoty zadané vo vstupe.

    2) V prípade, že sú hodnoty vždy rovnaké, môžete použiť konštanty.

    3) Ďalšou možnosťou je možnosť, že váš skript môže brať parametre.

    Na zdravie! Pavla.

  5.   Použime Linux dijo

    Je zaujímavé, čo spomínate. Nazýva sa to dvoma spôsobmi: línia shebang alebo priamo čiara bang. Dávam ti informácie: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Na zdravie! Pavla.

  6.   @llomellamomario dijo

    Je zaujímavé, že som nikdy neprestal premýšľať o tomto detaile. Bolo by zaujímavé vidieť ďalšie články o drotárovi, medzi nimi aj slávna rekompilácia jadra, ktorá odstráni kilogramy nepotrebného kódu, ktoré sú tu iba kvôli kompatibilite a zlepšeniu rýchlosti systému.

  7.   Použime Linux dijo

    Dobre. Budem to mať na pamäti.
    Na zdravie! Pavla.

  8.   Použime Linux dijo

    Som rád, že to fungovalo. Vždy sa snažím zverejňovať veci, ktoré by boli podľa mňa zaujímavé a praktické.
    Objatie! Pavla.

  9.   Felix Manuel Brito Amarante dijo

    Každý programátor so správnymi návykmi pridáva do prvého riadku kódu „riadok riadku“. V Pythone nikdy nezabudnem na kódovanie a tresku.
    #! / usr / bin / python2.7
    # *. * encoding = utf-8 *. *

  10.   diex02 dijo

    Výborne, dúfam, že môžete zverejniť viac informácií o príkazovom riadku, najmä pokiaľ ide o kompiláciu alebo inštaláciu zo zdrojových súborov (tar.gz atď.)

  11.   jo di castro dijo

    Nikdy som nepočul o „treske“, vždy som ju poznal ako Shebang

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

    pozdravy

  12.   Jonathan Fernandez dijo

    zaujímavá poznámka ... ďakujem!

  13.   eM Povedzte eM dijo

    Ako zaujímavé, prehlasujem, že som v programovaní a vo všetkom, čo sa týka skriptu, úplne ignorant, netušil som, ako to funguje, ale všimol som si, že niektoré majú túto hlavičku.

  14.   Mario raimondi dijo

    Vysvetlenie, ktoré sa mi stalo, ktoré sa týka tohto príspevku: Chcel som si nainštalovať modul gadget adobe air (kalkulačka pokerových kurzov). Inštalačný program adobe air urobí to, že spustí príslušný skript so „su“, ale vo forme ./ vás požiada o heslo root. Pretože skript nemal povolenia na vykonávanie, vrhal povolenie odmietnuté, riešenie: spustite skript pomocou sh, ak nechcete meniť povolenia (rýchlejšie ako prejsť do priečinka tmp chmod a podobne). Tam sa vykoná skript, ktorý zavolá inštalačný program adobe a ďalšiu motýľovú vec.

  15.   ero-sennin dijo

    Veľmi zaujímavý článok! Ďakujem, že ste mi pomohli dozvedieť sa viac informácií o konzole. Uvidíme, či budete aj naďalej publikovať články ako tieto ^^.
    Len tak ďalej, toto je bezpochyby môj obľúbený blog !!

  16.   erpower dijo

    Pamätajte, že medzi použitými verziami tlmočníka môžu byť rozdiely. Spustenie skriptu priamo podľa kódu shebang neexistuje spôsob, ako určiť, ktorá verzia tlmočníka sa má použiť, čo môže byť potrebné. Ak namiesto toho spustíte tlmočník a predáte skript ako parameter, viete, ktorá jeho verzia je spustená.

    Napríklad v Pythone, ak je shebang #! / Usr / bin / python2.4, program bude bežať inak, ako keby bol #! / Usr / bin / python2.6 alebo ak je #! / Usr / bin / python (čo je zvyčajne symbolický odkaz na verziu Pythonu, ktorá je predvolene nainštalovaná a nakonfigurovaná). Stáva sa to preto, lebo Python 2.6 má novú funkcionalitu, ktorá v Pythone 2.4 neexistovala, takže písanie skriptu, ktorý používa túto funkcionalitu označujúcu #! / Usr / bin / python shebang, zlyhá, ak má systém nainštalovaný iba python 2.4. Namiesto toho môžete kedykoľvek vynútiť spustenie skriptu s verziou pythonu, ktorú chcete, a to spustením reťazca „python2.4 /path/al/script.py“ alebo „python2.6 /path/al/script.py/

    Pre shell skripty existujú rozdiely aj medzi použitými shellmi, takže použitie #! / Bin / sh a #! / Bin / bash môže mať rôzne výsledky v závislosti od skriptu. Ak píšete skript pomocou funkcií, ktoré existujú iba v bashe, ale zadáte #! / Bin / sh shebang, váš skript bude pravdepodobne fungovať v systéme Linux (vo väčšine distribúcií je bin / sh symbolickým odkazom na bash), ale pravdepodobne zlyhá. v iných systémoch UNIX, kde nie je nainštalovaný bash alebo kde / bin / sh nie je symbolickým odkazom na / bin / bash.

    Aj v súvislosti s prenosnosťou je potrebné vziať do úvahy, že cesta uvedená v šebangu je absolútna a niekedy sú tlmočníci inštalovaní na iných miestach. Napríklad je bežné mať nainštalovaný tlmočník python v / usr / local / bin / python, ak ste si stiahli a skompilovali Python namiesto použitia balíka z vašej distribúcie. Ak je váš shebang #! / Usr / bin / python, skript nebude na týchto systémoch fungovať. Ak sa chcete vyhnúť týmto problémom, môžete použiť ako shebang „#! / Usr / bin / env python“ (alebo „#! / Usr / bin / env sh“), ako je vysvetlené v http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Použime Linux dijo

    Vďaka Jonathan! Rád vás vidím, komentár!
    Na zdravie! Pavla.

  18.   antonio dijo

    Nikde sa nerobí to, čo chcem vedieť, alebo aspoň neviem, ako to vo vyhľadávacom nástroji vyvolať, chcem vytvoriť skript, ktorý z nejakého dôvodu vykoná xX príkaz aptitude alebo «su» (je to iba príklad, ale sú to dva prípady, ktoré ma napadajú) a v prípade aptitude ma niekedy požiada o zadanie „yon“ alebo v „su“ o zadanie hesla ... Bol by som rád, keby tieto možnosti vybral skript automaticky buď odovzdaním parametra, alebo použitím metódy, ktorú nepozná .... Ďakujem za pozornosť

    1.    pouzivajme linux dijo

      Ahoj Antonio! Ak je vaším problémom zadanie hesla, nemyslím si, že existuje riešenie. Práve preto, že ide o bezpečnostné opatrenie, aby si nemohol každý nainštalovať program.
      Pokiaľ ide o pohotovosť a nutnosť povedať áno, myslím si, že sa to dá vyriešiť. V tejto chvíli si nepamätám presný parameter, ktorý by som mal použiť, ale jednoducho to zistím na manuálových stránkach. Otvorte terminál a zadajte príkaz: man aptitude.
      Objať! Pavla.

  19.   Dávid MM dijo

    Veľmi dobrý príspevok.
    Obzvlášť sa mi páčilo - v tomto príspevku -, že otázka / pochybnosť, ktorá vyvstáva, je zodpovedaná veľmi jasne a stručne.