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.
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.)
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.
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.
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.
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.
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.
V REDU. To bom imel v mislih.
Na zdravje! Paul.
Vesel sem, da je uspelo. Vedno poskušam objaviti stvari, ki se mi zdijo zanimive in praktične.
Objem! Paul.
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 *. *
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.)
Nikoli nisem slišal za "bang line", od nekdaj sem ga poznal kot Shebang
http://en.wikipedia.org/wiki/Shebang_%28Unix%29
pozdrav
zanimiva opomba ... hvala!
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.
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.
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 !!
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
Hvala Jonathan! Lepo vas je videti, da komentirate!
Na zdravje! Paul.
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
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.
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.