Koja je razlika između pokretanja bash skripte pomoću sh i ./

Isto se pitanje može pojaviti kada koristite bilo koju vrstu skripte, ne samo one bash. Postoji li velika razlika između pokretanja skripte kroz tumač i izravnog pokretanja?

Još jedna misterija koju ćemo otkriti u ovom zanimljivom postu iz Upotrijebimo Linux (uL).


Kada pokrenete skriptu prosljeđivanjem imena datoteke skripte interpretatoru (sh, python, perl, itd.), Zapravo izvršavate tumač, predajući program koji želite izvršiti kao argument. Na primjer, pokrećemo tumač sh tako što ćemo mu proslijediti argument miscript.sh.

sh miscript.sh

Ako skriptu pokrenete samostalno, sistem će pozvati interpretatora koji joj je potreban i tada će, da, izvršiti skriptu, predajući je kao argument interpretatoru, ali sve automatski i bez znanja korisnika koji je izvršio skriptu.

./miscript.sh

Da bi se skripta pokrenula sama, moraju biti zadovoljena 2 uvjeta:

1) skripta mora sadržavati "prasak". Ovo je prvi redak skripte, koji mora započeti znakovima #! i da morate navesti putanju na kojoj se nalazi tumač. Važno je napomenuti da je ovaj uvjet istinit za bilo koju vrstu skripte (python, perl, itd.), A ne samo za one iz bash-a.

Tako bi, na primjer, naša skripta trebala sadržavati sljedeće kao prvi redak:

#! / bin / bash

2) datoteka mora imati dozvole za izvršavanje:

Da bismo dodijelili dozvole za izvršenje našoj skripti, moramo napisati:

chmod a + x miscript.sh

Spremno, sada samo pokrenite ovako:

./miscript.sh

Ili kopiranjem skripte na "posebnu" putanju koja omogućava lako pozivanje na nju. Na primjer, možemo ga kopirati u / usr / sbin i pokrenuti s bilo kojeg mjesta bez uključivanja pune staze gdje se nalazi:

Kopiramo:

sudo cp miscript.sh / usr / sbin / miscript

Izvršavamo:

pogrešno napisano

Kao što vidite, u stvarnosti je ono što se događa iza scene vrlo slično u oba slučaja. Međutim, uključivanjem "praska", vaše će skripte biti puno lakše distribuirati, jer korisnici neće morati pamtiti put na kojem se nalaze potrebni tumači da bi ih mogli izvršiti. Zaključak: u osnovi je riječ o udobnosti.


Sadržaj članka pridržava se naših principa urednička etika. Da biste prijavili grešku, kliknite ovdje.

20 komentara, ostavi svoj

Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   Oswaldo Villarroel rekao je

    Slažem se s vama, Erpower, i verzija interpretatora i njegova putanja su promjenjive i nisu konstantne, čak tim više ako se uzme u obzir da GNU / Linux distribucije nisu jedine koje koriste Bash (postoje i: freeBSD, OpenSolaris, Mac) i mnogi od njih imaju različite konfiguracije ili rute.

    Važno je znati da imate fleksibilnost (kao što ste dobro spomenuli) da se igrate sa pozivom na skriptu, bilo sa ./ ili sa sh (ili python ... itd.)

  2.   el_que_sabe@gmail.com rekao je

    Bash je računalni program čija je funkcija tumačenje naloga.

    Zasnovan je na Unix ljusci i u skladu je s POSIX-om.

    umjesto toga sh je računalni program čija je funkcija tumačenje naloga.
    Uključuje funkcije kao što su kontrola procesa, preusmjeravanje
    ulaz / izlaz, popis datoteka i čitanje, zaštita,
    komunikacije i naredbeni jezik za pisanje programa
    serije ili skripte. To je bio tumač korišten u prvim verzijama Unixa i postao je de facto standard.

  3.   Diana C rekao je

    Pozdrav, početnik sam u korištenju skripti i želio bih znati može li mi netko pomoći s problemom koji imam:

    Upravljam programom koji zahtijeva uključivanje nekoliko početnih podataka kroz konzolu i otkrio sam da je putem skripte moguće izvršiti program s početnim podacima, tako da ga ne moram pisati iznova i iznova kada treba izvršiti program.

    Ne znam kako to učiniti, pa ako mi netko može pomoći u tome, bit ću mu jako zahvalan.

  4.   Koristimo Linux rekao je

    Vidite, to ovisi o tome na kojem programskom jeziku pišete skriptu. Međutim, u svakom slučaju trebate:

    1) Ako želite da korisnik mora unijeti te podatke kad god se skripta izvrši, najčešći postupak je da varijabla uzima vrijednosti unesene u ulaz.

    2) U slučaju da su vrijednosti uvijek iste, možete koristiti konstante.

    3) Druga opcija je mogućnost da vaša skripta može uzeti parametre.

    Živjeli! Paul.

  5.   Koristimo Linux rekao je

    Zanimljivo je ovo što spominjete. Naziva se na dva načina: shebang linija ili izravno praska linija. Predajem vam podatke: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Živjeli! Paul.

  6.   @llomellamomario rekao je

    Zanimljivo, nikad nisam prestao razmišljati o tom detalju. Bilo bi zanimljivo vidjeti još članaka o konzoli, među kojima je poznata rekompilacija kernela kako bi se uklonili kilogrami nepotrebnog koda koji postoje samo radi kompatibilnosti i poboljšanja brzine sistema.

  7.   Koristimo Linux rekao je

    U REDU. Imaću to na umu.
    Živjeli! Paul.

  8.   Koristimo Linux rekao je

    Drago mi je da je uspelo. Uvijek se trudim objavljivati ​​stvari koje mislim da bi mogle biti zanimljive i praktične.
    Zagrljaj! Paul.

  9.   Felix Manuel Brito Amarante rekao je

    Svaki programer s dobrim navikama dodaje "prasak" u prvi redak koda. U Pythonu nikada ne zaboravljam kodiranje i prasak.
    #! / usr / bin / python2.7
    # *. * kodiranje = utf-8 *. *

  10.   Diex02 rekao je

    Izvrsno, nadamo se da možete objaviti više informacija o naredbenom retku, posebno kada je u pitanju kompajliranje ili instaliranje iz izvornih datoteka (tar.gz, itd.)

  11.   joe di castro rekao je

    Nikad nisam čuo za "prasak". Oduvijek sam ga znao kao Shebang

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

    Saludos

  12.   Jonathan Fernandez rekao je

    zanimljiva napomena ... hvala!

  13.   eM Di eM rekao je

    Koliko je zanimljivo, proglašavam se potpuno neukim u programiranju i svemu vezanom za skriptu, nisam imao pojma kako to funkcionira, ali primijetio sam da neki imaju to zaglavlje.

  14.   Mario raimondi rekao je

    Pojašnjenje koje mi se dogodilo u vezi sa ovim unosom: Želio sam instalirati gadget od adobe air (kalkulator poker kvota). Ono što adobe air installer radi je pokretanje odgovarajuće skripte sa "su", ali u obliku ./ tražeći od vas root lozinku. Kako skripta nije imala dozvole za izvršenje, bacila je odbijenu dozvolu, rješenje: pokrenite skriptu sa sh ako ne želite promijeniti dozvole (brže od odlaska u tmp chmod mapu i sve to). Tamo se skripta izvršava, poziva Adobe programa za instalaciju i još jednu leptir stvar.

  15.   Ero-Sennin rekao je

    Vrlo zanimljiv članak! Hvala što ste mi pomogli da znam malo više o konzoli. Da vidimo hoćete li i dalje objavljivati ​​članke poput ovih ^^.
    Nastavite, ovo je bez sumnje moj omiljeni blog !!

  16.   Erpower rekao je

    Imajte na umu da mogu postojati razlike između korištenih verzija tumača. Pokretanjem skripte izravno prema shebangu ne postoji način da se naznači koju će verziju tumača koristiti, što bi moglo biti potrebno. Ako umjesto toga pokrenete interpretator i predate skriptu kao parametar, znate koja se njegova verzija izvodi.

    Na primjer, u Pythonu, ako je shebang #! / Usr / bin / python2.4, program će se izvoditi drugačije nego ako je #! / Usr / bin / python2.6 ili ako je #! / Usr / bin / python (što je obično simbolična veza do verzije Pythona koja je instalirana i konfigurirana prema zadanim postavkama). To se događa zato što Python 2.6 ima novu funkcionalnost koja nije postojala u Pythonu 2.4, pa će pisanje skripte koja koristi tu funkcionalnost označavajući #! / Usr / bin / python shebang propasti ako sistem ima instaliran samo python 2.4. Umjesto toga, skriptu uvijek možete prisiliti da se pokrene s željenom verzijom pythona tako što ćete je pokrenuti s "python2.4 /path/al/script.py" ili "python2.6 /path/al/script.py/

    Za skripte ljuske također postoje razlike između ljuski koje koristite, pa upotreba #! / Bin / sh i #! / Bin / bash može imati različite rezultate, ovisno o skripti. Ako napišete skriptu koristeći značajke koje postoje samo u bashu, ali navedete shebang #! / Bin / sh, vaša skripta će vjerojatno raditi na Linuxu (na većini distribucija / bin / sh je simbolična veza do basha), ali vjerojatno neće uspjeti u ostali UNIX-ovi gdje bash nije instaliran ili gdje / bin / sh nije simbolična veza do / bin / bash.

    Takođe vezano za prenosivost, mora se uzeti u obzir da je put naznačen u shebangu apsolutni, a postoje slučajevi kada se tumači instaliraju na drugim mjestima. Na primjer, uobičajeno je da je python interpreter instaliran u / usr / local / bin / python ako ste preuzeli i kompajlirali Python umjesto da koristite paket iz vaše distribucije. Ako je vaš shebang #! / Usr / bin / python, skripta neće raditi na tim sistemima. Da biste pokušali izbjeći ove probleme, možete koristiti kao shebang "#! / Usr / bin / env python" (ili "#! / Usr / bin / env sh") kako je objašnjeno u http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Koristimo Linux rekao je

    Hvala Jonathan! Drago mi je vidjeti vaš komentar!
    Živjeli! Paul.

  18.   Antonio rekao je

    Nigdje ono što želim znati, ili barem ne znam kako to podići u pretraživaču, želim stvoriti skriptu koja iz razloga xX izvršava naredbu aptitude ili «su» (to je samo primjer, ali to su 2 slučaja koja Mogu se sjetiti), a u slučaju sposobnosti ponekad me traži da unesem "yon" ili u "su" traži lozinku ... Želio bih da skripta automatski odabere ove opcije prosljeđivanjem parametra ili pomoću neke metode koju ne zna ... . Hvala na pažnji

    1.    iskoristimo linux rekao je

      Zdravo Antonio! Ako je vaš problem unošenje lozinke, mislim da ne postoji rješenje. Upravo zato što je to sigurnosna mjera, tako da ne mogu svi instalirati program.
      Što se tiče sposobnosti i potrebe da kažem da, mislim da se to može riješiti. Trenutno se ne sjećam točnog parametra koji bih trebao koristiti, ali samo saznajte na man stranicama. Otvorite terminal i unesite naredbu: man aptitude.
      Zagrljaj! Paul.

  19.   David MM rekao je

    Vrlo dobar post.
    Posebno mi se svidjelo - u ovom postu - što se na postavljeno pitanje / sumnju odgovara vrlo jasno i sažeto.