Care este diferența dintre rularea unui script bash folosind sh și ./

Aceeași întrebare poate apărea atunci când se utilizează orice tip de script, nu doar cele bash. Există o diferență majoră între rularea unui script prin interpret și executarea directă a acestuia?

Încă un mister pe care îl vom dezvălui în această interesantă postare de la Let's Use Linux (uL).


Când rulați un script trecând numele fișierului scriptului către un interpret (sh, python, perl etc.), efectuați executarea interpretului, trecând programul pe care doriți să îl executați ca argument. De exemplu, executăm interpretul sh trimițându-i argumentul miscript.sh.

sh myscript.sh

Dacă rulați scriptul de unul singur, sistemul va apela la interpretul de care are nevoie și, atunci, da, va executa scriptul, trecându-l ca argument către interpret, dar totul automat și fără ca utilizatorul care a executat scriptul să știe.

./myscript.sh

Pentru a rula un script de unul singur, trebuie îndeplinite 2 condiții:

1) scriptul trebuie să includă o „linie de bang”. Aceasta este prima linie a unui script, care trebuie să înceapă cu caracterele #! și că trebuie să specificați calea în care se află interpretul. Este important să rețineți că această condiție este adevărată pentru orice tip de script (python, perl etc.), nu doar pentru cele din bash.

Astfel, de exemplu, scriptul nostru ar trebui să conțină următoarele ca primă linie:

#! / Bin / bash

2) fișierul trebuie să aibă permisiuni de executare:

Pentru a acorda permisiuni de execuție scriptului nostru, trebuie să scriem:

chmod a + x miscript.sh

Gata, acum rulați-l astfel:

./myscript.sh

Sau prin copierea scriptului pe o cale "specială" care îi permite să fie invocată cu ușurință. De exemplu, îl putem copia în / usr / sbin și îl putem rula de oriunde fără a include calea completă în care se află:

Copiem:

sudo cp miscript.sh / usr / sbin / miscript

Executăm:

scris greșit

După cum puteți vedea, în realitate, ceea ce se întâmplă în culise este foarte asemănător în ambele cazuri. Cu toate acestea, prin includerea unei „linii bang”, scripturile dvs. vor fi mult mai ușor de distribuit, deoarece utilizatorii nu vor trebui să-și amintească calea în care se află interpretii necesari pentru a le putea executa. Concluzie: este practic o chestiune de confort.


Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   Oswaldo Villarroel el a spus

    Sunt de acord cu dvs. Erpower, atât versiunea interpretului, cât și calea acestuia sunt variabile și nu constante, cu atât mai mult dacă se consideră că distribuțiile GNU / Linux nu sunt singurele care folosesc Bash (există și: freeBSD, OpenSolaris, Mac) și multe altele dintre ele au configurații sau rute diferite.

    Important este să știi că ai flexibilitatea (așa cum ai menționat bine) să te joci cu apelul la script, fie cu ./ fie cu sh (sau python ... etc)

  2.   el_who_knows@gmail.com el a spus

    Bash este un program de calculator a cărui funcție este de a interpreta ordinele.

    Se bazează pe shell-ul Unix și este conform POSIX.

    în schimb sh este un program de calculator a cărui funcție este de a interpreta ordinele.
    Incorporează caracteristici precum controlul procesului, redirecționarea
    intrare / ieșire, listarea și citirea fișierelor, protecție,
    comunicații și un limbaj de comandă pentru scrierea programelor de către
    loturi sau scripturi. A fost interpretul folosit în primele versiuni de Unix și a devenit un standard de facto.

  3.   Diana C. el a spus

    Bună ziua, sunt un începător în utilizarea scripturilor și aș vrea să știu dacă cineva mă poate ajuta cu o problemă pe care o am:

    Gestionez un program care necesită includerea mai multor date inițiale prin consolă și am aflat că printr-un script este posibil să se execute programul cu datele inițiale, pentru a nu trebui să-l scriu iar și iar când trebuie să rulez programul.

    Nu știu cum să o fac, așa că, dacă cineva mă poate ajuta cu asta, voi fi foarte recunoscător.

  4.   Să folosim Linux el a spus

    Vezi, depinde de limbajul de programare în care scrii scriptul. Cu toate acestea, în orice caz, aveți nevoie de:

    1) Dacă doriți ca utilizatorul să introducă aceste date ori de câte ori este executat scriptul, cea mai obișnuită procedură este ca o variabilă să ia valorile introduse în intrare.

    2) În cazul în care valorile sunt întotdeauna aceleași, puteți utiliza constante.

    3) O altă opțiune este posibilitatea ca scriptul dvs. să poată lua parametri.

    Noroc! Paul.

  5.   Să folosim Linux el a spus

    Este interesant ce menționezi. Se numește din cele 2 forme: linie shebang sau direct linie bang. Vă dau informațiile: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Noroc! Paul.

  6.   @llomellamomario el a spus

    Interesant, nu mă oprisem niciodată să mă gândesc la acel detaliu. Ar fi interesant să vedem mai multe articole de consolare, printre care celebra recompilare a nucleului pentru a elimina kilogramele de cod inutil care sunt disponibile doar pentru compatibilitate și pentru a îmbunătăți viteza sistemului.

  7.   Să folosim Linux el a spus

    BINE. O sa tin minte asta.
    Noroc! Paul.

  8.   Să folosim Linux el a spus

    Mă bucur că a funcționat. Încerc mereu să postez lucruri care cred că ar putea fi interesante și practice.
    O imbratisare! Paul.

  9.   Felix Manuel Brito Amarante el a spus

    Fiecare programator cu obiceiuri bune adaugă o „linie bang” la prima linie de cod. În Python nu uit niciodată codarea și linia bang.
    #! / usr / bin / python2.7
    # *. * codificare = utf-8 *. *

  10.   diex02 el a spus

    Excelent, sperăm că puteți publica mai multe informații despre linia de comandă, mai ales atunci când vine vorba de compilarea sau instalarea din fișiere sursă (tar.gz etc.)

  11.   joe di castro el a spus

    Nu auzisem niciodată de „bang line”, am cunoscut-o întotdeauna sub numele de Shebang

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

    În ceea ce priveşte

  12.   Jonathan Fernandez el a spus

    notă interesantă ... mulțumesc!

  13.   eM Spune eM el a spus

    Cât de interesant, mă declar total ignorant în ceea ce privește programarea și tot ceea ce ține de scenariu, habar nu aveam cum funcționează, dar am observat că unii au acel antet.

  14.   Mario raimondi el a spus

    O clarificare care mi s-a întâmplat și care are legătură cu această postare: am vrut să instalez un gadget Adobe Air (un calculator de cote de poker). Ceea ce face Adobe Air Installer este să ruleze scriptul corespunzător cu „su”, dar în formularul ./ solicitându-vă parola de root. Deoarece scriptul nu avea permisiuni de execuție, a respins permisiunea refuzată, soluția: rulați scriptul cu sh dacă nu doriți să modificați permisiunile (mai repede decât să mergeți la folderul tmp chmod și toate acestea). Acolo scriptul este executat, apelează programul de instalare Adobe și un alt lucru fluture.

  15.   ero-sennin el a spus

    Foarte interesant articol! Mulțumesc că m-ați ajutat să învăț puțin mai multe despre consolă. Să vedem dacă continuați să publicați articole ca acestea ^^.
    Tine-o asa, acesta este fara indoiala blogul meu preferat !!

  16.   erpower el a spus

    Rețineți că pot exista diferențe între versiunile de interpret care sunt utilizate. Rularea scriptului direct în funcție de shebang nu există nicio modalitate de a indica ce versiune a interpretului să utilizeze, care ar putea fi necesară. Dacă rulați în schimb interpretul și treceți scriptul ca parametru, știți ce versiune a acestuia rulează.

    De exemplu în Python, dacă shebang este #! / Usr / bin / python2.4, programul se va executa diferit decât dacă este #! / Usr / bin / python2.6 sau dacă este #! / Usr / bin / python (care este de obicei o legătură simbolică către versiunea Python instalată și configurată implicit). Acest lucru se întâmplă deoarece Python 2.6 are funcționalități noi care nu existau în Python 2.4, deci scrierea unui script care folosește acea funcționalitate indicând un shebang #! / Usr / bin / python va eșua dacă sistemul are doar python 2.4 instalat. În schimb, puteți forța oricând scriptul să ruleze cu versiunea de python dorită, pornindu-l cu „python2.4 /path/al/script.py” sau „python2.6 /path/al/script.py/

    Pentru scripturile shell, există, de asemenea, diferențe între shell-urile pe care le utilizați, astfel încât utilizarea #! / Bin / sh și #! / Bin / bash poate avea rezultate diferite în funcție de script. Dacă scrieți un script folosind funcții care există doar în bash, dar specificați un #! / Bin / sh shebang, scriptul dvs. va funcționa probabil pe Linux (pe majoritatea distribuțiilor / bin / sh este o legătură simbolică către bash), dar probabil că va eșua în alte UNIX-uri unde bash nu este instalat sau unde / bin / sh nu este o legătură simbolică către / bin / bash.

    De asemenea, legat de portabilitate, trebuie luat în considerare faptul că calea indicată în shebang este absolută și există momente în care interpreții sunt instalați în alte locuri. De exemplu, este obișnuit să aveți interpretul python instalat în / usr / local / bin / python dacă ați descărcat și compilat Python în loc să utilizați un pachet din distribuția dvs. Dacă shebang-ul dvs. este #! / Usr / bin / python, scriptul nu va funcționa pe aceste sisteme. Pentru a încerca să evitați aceste probleme, puteți folosi ca shebang "#! / Usr / bin / env python" (sau "#! / Usr / bin / env sh") așa cum este explicat în http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Să folosim Linux el a spus

    Mulțumesc Jonathan! Mă bucur să vă văd comentarii!
    Noroc! Paul.

  18.   Antonio el a spus

    Nicăieri nu face ceea ce vreau să știu sau cel puțin nu știu cum să-l introduc în motorul de căutare, vreau să creez un script care dintr-un motiv xX execută comanda aptitude sau «su» (este doar un exemplu, dar există cele 2 cazuri Ma pot gandi) si in cazul aptitude uneori imi cere sa introduc "yon" sau in "su" imi cere parola ... As dori ca scriptul sa selecteze automat aceste optiuni fie prin trecerea unui parametru, fie folosind o metoda pe care nu o cunoaste ... . Multumesc pentru atentie

    1.    să folosim Linux el a spus

      Buna Antonio! Dacă problema dvs. este să introduceți parola, nu cred că există o soluție. Tocmai pentru că este o măsură de securitate, astfel încât nu toată lumea poate instala un program.
      În ceea ce privește aptitudinea și nevoia de a pune da, cred că se poate rezolva. Nu îmi amintesc în acest moment parametrul exact de utilizat, ci doar aflați în paginile de manual. Deschideți un terminal și introduceți comanda: man aptitude.
      Îmbrăţişare! Paul.

  19.   David M.M. el a spus

    Post foarte bun.
    Mi-a plăcut în mod special - în această postare - că la întrebarea / îndoiala care apare se răspunde foarte clar și concis.