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.
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)
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.
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.
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.
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.
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.
BINE. O sa tin minte asta.
Noroc! Paul.
Mă bucur că a funcționat. Încerc mereu să postez lucruri care cred că ar putea fi interesante și practice.
O imbratisare! Paul.
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 *. *
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.)
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
notă interesantă ... mulțumesc!
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.
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.
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 !!
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
Mulțumesc Jonathan! Mă bucur să vă văd comentarii!
Noroc! Paul.
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
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.
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.