Jaký je rozdíl mezi spuštěním bash skriptu pomocí sh a ./

Stejná otázka může vyvstat při použití jakéhokoli typu skriptu, nejen těch bash. Existuje zásadní rozdíl mezi spuštěním skriptu prostřednictvím tlumočníka a jeho přímým spuštěním?

Ještě jedna záhada, kterou odhalíme v tomto zajímavém příspěvku od Let's Use Linux (uL).


Když spustíte skript předáním názvu souboru skriptu tlumočníkovi (sh, python, perl atd.), Provádíte ve skutečnosti tlumočníka a program, který chcete spustit, předáte jako argument. Například spustíme interpret sh předáním argumentu miscript.sh.

sh myscript.sh

Pokud spustíte skript sám, systém zavolá tlumočníka, kterého potřebuje, a pak ano, provede skript a předá jej jako argument tlumočníkovi, ale vše automaticky a bez vědomí uživatele, který skript provedl.

./myscript.sh

Aby bylo možné spustit skript samostatně, musí být splněny 2 podmínky:

1) skript musí obsahovat „ofinu“. Toto je první řádek skriptu, který musí začínat znaky #! a že musíte určit cestu, kde se nachází tlumočník. Je důležité si uvědomit, že tato podmínka platí pro jakýkoli typ skriptu (python, perl atd.), Nejen pro ty z bash.

Například náš skript by měl jako první řádek obsahovat následující:

#! / bin / bash

2) soubor musí mít oprávnění ke spuštění:

Abychom našemu skriptu mohli udělit oprávnění ke spuštění, musíme napsat:

chmod a + x miscript.sh

Připraveno, nyní to spusťte takto:

./myscript.sh

Nebo zkopírováním skriptu na „speciální“ cestu, která umožňuje jeho snadné vyvolání. Například jej můžeme zkopírovat do / usr / sbin a spustit jej odkudkoli, aniž bychom zahrnuli úplnou cestu tam, kde se nachází:

Kopírujeme:

sudo cp miscript.sh / usr / sbin / miscript

Provádíme:

chybný

Jak vidíte, ve skutečnosti je to, co se děje v zákulisí, v obou případech velmi podobné. Zahrnutím „řádky“ však bude vaše skripty mnohem jednodušší distribuovat, protože uživatelé si nebudou muset pamatovat cestu, kde se nacházejí potřební tlumočníci, aby je mohli spustit. Závěr: v zásadě jde o pohodlí.


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   Oswaldo Villarroel řekl

    Souhlasím s vámi Erpower, jak verze tlumočníka, tak jeho cesta jsou variabilní a ne konstantní, tím spíše, pokud se má za to, že distribuce GNU / Linux nejsou jediné, které používají Bash (existují také: freeBSD, OpenSolaris, Mac) a mnoho z nich mají různé konfigurace nebo trasy.

    Důležité je vědět, že máte flexibilitu (jak jste dobře zmínil) hrát s voláním skriptu, buď s ./ nebo s sh (nebo python ... atd.)

  2.   on_who_knows@gmail.com řekl

    Bash je počítačový program, jehož funkcí je interpretovat objednávky.

    Je založen na unixovém prostředí a je kompatibilní s POSIX.

    místo toho sh je počítačový program, jehož funkcí je interpretovat příkazy.
    Zahrnuje funkce, jako je řízení procesu, přesměrování
    vstup / výstup, výpis a čtení souborů, ochrana,
    komunikace a příkazový jazyk pro psaní programů pomocí
    dávky nebo skripty. Byl to tlumočník používaný v prvních verzích Unixu a stal se de facto standardem.

  3.   Diana C. řekl

    Dobrý den, v používání skriptů jsem začátečník a chtěl bych vědět, jestli mi někdo může pomoci s problémem, který mám:

    Spravuji program, který vyžaduje zahrnutí několika počátečních dat přes konzolu, a zjistil jsem, že pomocí skriptu je možné spustit program s počátečními daty, abych ho nemusel psát znovu a znovu, když potřebuji spustit program.

    Nevím, jak na to, takže pokud mi s tím někdo pomůže, budu velmi vděčný.

  4.   Pojďme použít Linux řekl

    Podívejte se, záleží na tom, v jakém programovacím jazyce píšete skript. V každém případě však potřebujete:

    1) Pokud chcete, aby uživatel musel tato data zadávat při každém spuštění skriptu, je nejběžnějším postupem, aby proměnná převzala hodnoty zadané ve vstupu.

    2) V případě, že jsou hodnoty vždy stejné, můžete použít konstanty.

    3) Další možností je možnost, že váš skript může mít parametry.

    Na zdraví! Pavel.

  5.   Pojďme použít Linux řekl

    Je zajímavé, co zmiňuješ. Říká se jí 2 formy: linie shebang nebo přímá linie bang. Dávám vám informace: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Na zdraví! Pavel.

  6.   @llomellamomario řekl

    Zajímavé, nikdy jsem nepřestal přemýšlet o tomto detailu. Bylo by zajímavé vidět více článků o retušování konzolů, mezi nimi i slavná rekompilace jádra k odstranění zbytečných kilogramů kódu, které jsou k dispozici pouze kvůli kompatibilitě a zlepšení rychlosti systému.

  7.   Pojďme použít Linux řekl

    DOBŘE. Budu na to myslet.
    Na zdraví! Pavel.

  8.   Pojďme použít Linux řekl

    Jsem rád, že to fungovalo. Vždy se snažím zveřejňovat věci, které považuji za zajímavé a praktické.
    Objetí! Pavel.

  9.   Felix Manuel Brito Amarante řekl

    Každý programátor s dobrými návyky přidá do prvního řádku kódu „řádkovou linku“. V Pythonu nikdy nezapomenu na kódování a bang line.
    #! / usr / bin / python2.7
    # *. * encoding = utf-8 *. *

  10.   diex02 řekl

    Skvělé, doufám, že můžete publikovat více informací o příkazovém řádku, zejména pokud jde o kompilaci nebo instalaci ze zdrojových souborů (tar.gz atd.)

  11.   jo di castro řekl

    Nikdy jsem neslyšel o „bang line“, vždy jsem to znal jako Shebang

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

    pozdravy

  12.   Jonathan Fernandez řekl

    zajímavá poznámka ... děkuji!

  13.   eM Řekněte eM řekl

    Jak zajímavé, prohlašuji se za naprosto ignoranta programování a všeho, co souvisí se skriptem, neměl jsem tušení, jak to funguje, ale všiml jsem si, že někteří mají tuto hlavičku.

  14.   Mario raimondi řekl

    Vysvětlení, které se mi stalo, souvisí s tímto příspěvkem: Chtěl jsem si nainstalovat Adobe Air gadget (kalkulačka pokerových kurzů). Instalační program adobe air provede to, že spustí odpovídající skript se „su“, ale ve tvaru ./ vás požádá o heslo root. Vzhledem k tomu, že skript neměl oprávnění k provádění, vrhl oprávnění odepřeno, řešení: spusťte skript s sh, pokud nechcete změnit oprávnění (rychlejší než jít do složky tmp chmod a tak dále). Tam se skript spustí, zavolá instalační program adobe a další motýlí věc.

  15.   ero-sennin řekl

    Velmi zajímavý článek! Děkujeme, že jste mi pomohli dozvědět se něco více o konzole. Uvidíme, jestli budete i nadále publikovat takové články ^ ^.
    Pokračujte, toto je bezpochyby můj oblíbený blog !!

  16.   moc řekl

    Pamatujte, že mezi použitými verzemi tlumočníka mohou existovat rozdíly. Spuštění skriptu přímo podle shebangu neexistuje způsob, jak určit, kterou verzi tlumočníka použít, což může být nezbytné. Pokud místo toho spustíte tlumočník a předáte skript jako parametr, víte, která verze je spuštěna.

    Například v Pythonu, pokud je shebang #! / Usr / bin / python2.4, program poběží jinak, než kdyby byl #! / Usr / bin / python2.6 nebo pokud je #! / Usr / bin / python (což je obvykle symbolický odkaz na verzi Pythonu, která je ve výchozím nastavení nainstalována a nakonfigurována). K tomu dochází, protože Python 2.6 má nové funkce, které v Pythonu 2.4 neexistovaly, takže psaní skriptu, který používá tuto funkci označující #! / Usr / bin / python shebang, selže, pokud má systém nainstalován pouze python 2.4. Místo toho můžete vždy vynutit spuštění skriptu s verzí pythonu, kterou chcete, spuštěním příkazu „python2.4 /path/al/script.py“ nebo „python2.6 /path/al/script.py/

    U skriptů prostředí existují také rozdíly mezi použitými skořápkami, takže použití #! / Bin / sh a #! / Bin / bash může mít různé výsledky v závislosti na skriptu. Pokud píšete skript pomocí funkcí, které existují pouze v bash, ale zadáte #! / Bin / sh shebang, váš skript pravděpodobně bude fungovat v Linuxu (na většině distribucí / bin / sh je symbolický odkaz na bash), ale pravděpodobně selže v jiných unixových systémech, kde není nainstalován bash nebo kde / bin / sh není symbolický odkaz na / bin / bash.

    Také v souvislosti s přenositelností je třeba vzít v úvahu, že cesta uvedená v shebangu je absolutní a v některých případech jsou tlumočníci instalováni na jiných místech. Například je běžné mít nainstalovaný tlumočník pythonu v / usr / local / bin / python, pokud jste si stáhli a zkompilovali Python namísto použití balíčku z vaší distribuce. Pokud je váš shebang #! / Usr / bin / python, skript na těchto systémech nebude fungovat. Chcete-li se těmto problémům vyhnout, můžete použít jako shebang „#! / Usr / bin / env python“ (nebo „#! / Usr / bin / env sh“), jak je vysvětleno v http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Pojďme použít Linux řekl

    Díky Jonathane! Rád vás vidím, komentář!
    Na zdraví! Pavel.

  18.   Antonio řekl

    Nikde nic, co chci vědět, nebo alespoň nevím, jak to ve vyhledávači zvýšit, chci vytvořit skript, který z nějakého důvodu xX provede příkaz aptitude nebo «su» (je to jen příklad, ale jsou to dva případy, které mě napadnou) a v případě aptitude mě někdy požádá o zadání „yon“ nebo v „su“ požádá o heslo ... chtěl bych, aby skript tyto možnosti vybral automaticky buď předáním parametru, nebo pomocí metody, kterou nezná .... Díky za pozornost

    1.    pojďme použít linux řekl

      Ahoj Antonio! Pokud je vaším problémem zadání hesla, nemyslím si, že existuje řešení. Právě proto, že se jedná o bezpečnostní opatření, aby si každý nemohl nainstalovat program.
      Co se týče zdatnosti a nutnosti vyjádřit ano, myslím, že to lze vyřešit. V tuto chvíli si nepamatuji přesný parametr, který mám použít, ale zjistím to na manuálových stránkách. Otevřete terminál a zadejte příkaz: man aptitude.
      Objetí! Pavel.

  19.   David M.M. řekl

    Velmi dobrý příspěvek.
    Obzvláště se mi líbilo - v tomto příspěvku - že otázka / pochybnost, která vyvstává, je zodpovězena velmi jasně a stručně.