Ano ang pagkakaiba sa pagitan ng pagpapatakbo ng isang bash script gamit ang sh at ./

Ang parehong tanong na ito ay maaaring lumitaw kapag gumagamit ng anumang uri ng script, hindi lamang ang mga bash. Mayroon bang pangunahing pagkakaiba sa pagitan ng pagpapatakbo ng isang script sa pamamagitan ng interpreter at direktang pagpapatakbo nito?

Isa pang misteryo na isisiwalat namin sa kagiliw-giliw na post na ito mula sa Gumamit Tayo ng Linux (uL).


Kapag nagpatakbo ka ng isang script sa pamamagitan ng pagpasa ng filename ng script sa isang interpreter (sh, python, perl, atbp.), Pinapatupad mo talaga ang interpreter, na ipinapasa ang program na nais mong ipatupad bilang isang argument. Halimbawa, pinapatakbo namin ang sh interpreter sa pamamagitan ng pagpasa nito ng miscript.sh argument.

sh myscript.sh

Kung patakbuhin mo ang script nang mag-isa, tatawagin ng system ang interpreter na kinakailangan nito at, kung gayon, oo, isasagawa nito ang script, na ipinapasa ito bilang isang argument sa interpreter, ngunit awtomatiko at walang lahat ang gumagamit na nagpatupad ng script.

./myscript.sh

Upang magpatakbo ng isang script nang mag-isa, 2 mga kundisyon ang dapat matugunan:

1) ang script ay dapat na may kasamang isang "bang line". Ito ang unang linya ng isang script, na dapat magsimula sa mga character na #! at dapat mong tukuyin ang landas kung saan matatagpuan ang interpreter. Mahalagang tandaan na ang kondisyong ito ay totoo para sa anumang uri ng script (python, perl, atbp.), Hindi lamang ang mga nagmula sa bash.

Kaya, halimbawa, ang aming script ay dapat maglaman ng mga sumusunod bilang unang linya:

#! / bin / bash

2) ang file ay dapat na mayroong pagpapatupad ng mga pahintulot:

Upang bigyan ang mga pahintulot sa pagpapatupad sa aming script, dapat kaming magsulat:

chmod a + x miscript.sh

Handa, ngayon lamang patakbuhin ito tulad nito:

./myscript.sh

O sa pamamagitan ng pagkopya ng script sa isang "espesyal" na landas na nagbibigay-daan sa itong madaling maaplay. Halimbawa, maaari nating kopyahin ito sa / usr / sbin at patakbuhin ito mula sa kahit saan nang hindi kasama ang buong landas kung saan ito matatagpuan:

Kinokopya namin:

sudo cp miscript.sh / usr / sbin / miscript

Isinasagawa namin:

myscript

Tulad ng nakikita mo, sa katotohanan kung ano ang nangyayari sa likod ng mga eksena ay halos magkatulad sa parehong mga kaso. Gayunpaman, sa pamamagitan ng pagsasama ng isang "bang line", ang iyong mga script ay magiging mas madali upang ipamahagi, dahil ang mga gumagamit ay hindi kailangang tandaan ang landas kung saan matatagpuan ang mga kinakailangang interpreter upang maipatupad ang mga ito. Konklusyon: ito ay karaniwang isang katanungan ng ginhawa.


Ang nilalaman ng artikulo ay sumusunod sa aming mga prinsipyo ng etika ng editoryal. Upang mag-ulat ng isang pag-click sa error dito.

20 na puna, iwan mo na ang iyo

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   Oswaldo Villarroel dijo

    Sumasang-ayon ako sa iyo Erpower, ang parehong bersyon ng interpreter at ang landas nito ay variable at hindi pare-pareho, lalo na kung isinasaalang-alang na ang mga pamamahagi ng GNU / Linux ay hindi lamang ang gumagamit ng Bash (mayroon ding: freeBSD, OpenSolaris , Mac) at marami sa kanila ay may iba't ibang mga pagsasaayos o ruta.

    Ang mahalagang bagay ay malaman na mayroon kang kakayahang umangkop (tulad ng nabanggit mo rin) upang i-play ang tawag sa script, alinman sa ./ o sa sh (o sawa ... atbp)

  2.   he_who_knows@gmail.com dijo

    Ang Bash ay isang programa sa computer na ang pagpapaandar ay upang bigyang kahulugan ang mga order.

    Ito ay batay sa Unix shell at sumusunod sa POSIX.

    sa halip sh ay isang programa sa computer na ang pagpapaandar ay upang bigyang kahulugan ang mga order.
    Nagsasama ng mga tampok tulad ng control ng proseso, pag-redirect
    input / output, listahan ng file at pagbabasa, proteksyon,
    komunikasyon at isang wikang pang-utos para sa pagsusulat ng mga programa ni
    mga batch o script. Ito ang ginamit na interpreter sa mga unang bersyon ng Unix at ito ay naging isang pamantayan sa pamantayan.

  3.   Diana C dijo

    Kumusta, nagsisimula ako sa paggamit ng mga script at nais kong malaman kung may makakatulong sa akin sa isang problema na mayroon ako:

    Namamahala ako ng isang programa na nangangailangan ng pagsasama ng maraming paunang data sa pamamagitan ng console at nalaman ko na sa pamamagitan ng isang script posible na maipatupad ang programa sa paunang data, upang hindi ko ito maisulat nang paulit-ulit kapag kailangang patakbuhin ang programa.

    Hindi ko alam kung paano ito gawin, kaya kung may makakatulong sa akin sa ganito ay lubos akong nagpapasalamat.

  4.   Gumamit tayo ng Linux dijo

    Kita n'yo, nakasalalay ito sa kung anong wika sa pagprogram ang sinusulat mo ang iskrip. Gayunpaman, sa anumang kaso ang kailangan mo ay:

    1) Kung nais mong ipasok ng gumagamit ang data na iyon sa tuwing naisasagawa ang script, ang pinakakaraniwang pamamaraan ay para sa isang variable na kunin ang mga halagang ipinasok sa input.

    2) Kung sakaling ang mga halaga ay laging pareho, maaari mong gamitin ang mga pare-pareho.

    3) Ang isa pang pagpipilian ay ang posibilidad na ang iyong script ay maaaring kumuha ng mga parameter.

    Cheers! Paul

  5.   Gumamit tayo ng Linux dijo

    Nakakatuwa ang nabanggit mo. Ito ay tinawag ng 2 form: shebang line o direktang bang line. Ibinibigay ko sa iyo ang impormasyon: http://python.about.com/od/programmingglossary/g/defbangline.htm
    Cheers! Paul

  6.   @llomellamomario dijo

    Kagiliw-giliw, hindi ako tumigil upang isipin ang tungkol sa detalyeng iyon. Nakatutuwang makita ang higit pang mga consoler tinkering na artikulo, kasama ang sikat na recompilation ng kernel upang alisin ang mga kilo ng hindi kinakailangang code na naroroon lamang para sa pagiging tugma at pagbutihin ang bilis ng system.

  7.   Gumamit tayo ng Linux dijo

    SIGE. Kukunin ko na panatilihin sa isip.
    Cheers! Paul

  8.   Gumamit tayo ng Linux dijo

    Natutuwa akong gumana ito. Palagi kong sinusubukan na mag-post ng mga bagay na sa palagay ko ay maaaring maging kawili-wili at praktikal.
    Isang yakap! Paul

  9.   Felix Manuel Brito Amarante dijo

    Ang bawat programmer na may mahusay na gawi ay nagdaragdag ng isang "bang line" sa unang linya ng code. Sa Python hindi ko nakakalimutan ang coding at ang bang line.
    #! / usr / bin / python2.7
    # *. * encoding = utf-8 *. *

  10.   Diex02 dijo

    Mahusay, sana makapag-publish ka ng maraming impormasyon tungkol sa linya ng utos, lalo na pagdating sa pag-iipon o pag-install mula sa mga pinagmulang file (tar.gz, atbp.)

  11.   joe di castro dijo

    Hindi ko pa naririnig ang "bang line" na palagi ko itong kilala bilang Shebang

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

    Regards

  12.   Jonathan Fernandez dijo

    kagiliw-giliw na tala ... salamat!

  13.   eM Sabihin mo eM dijo

    Gaano kagiliw-giliw, idineklara ko ang aking sarili na ganap na ignorante sa programa at lahat ng nauugnay sa script, wala akong ideya kung paano ito gumagana, ngunit napansin ko na ang ilan ay mayroong header na iyon.

  14.   Mario raimondi dijo

    Isang paglilinaw na nangyari sa akin na may kinalaman sa entry na ito: Nais kong mag-install ng isang adobe air gadget (isang calculator ng odds ng poker). Ang ginagawa ng adobe air installer ay ang pagpapatakbo ng kaukulang script na may "su" ngunit sa form ./ na humihiling sa iyo ng root password. Dahil ang script ay walang mga pahintulot sa pagpapatupad, itinapon ang pahintulot na tinanggihan, ang solusyon: patakbuhin ang script na may sh kung hindi mo nais na baguhin ang mga pahintulot (mas mabilis kaysa sa pagpunta sa folder ng tmp chmod at lahat ng iyon). Doon naisakatuparan ang script, tinawag nito ang adobe installer at isa pang butterfly na bagay.

  15.   Ero-Sennin dijo

    Napakainteresyong artikulo! Salamat sa pagtulong sa akin na malaman ang kaunti pa tungkol sa console. Tingnan natin kung patuloy kang naglalathala ng mga artikulo tulad nito ^^.
    Panatilihin ito, ito ay walang duda ang aking paboritong blog !!

  16.   erpower dijo

    Dapat pansinin na maaaring may mga pagkakaiba sa pagitan ng mga bersyon ng interpreter na ginamit. Ang pagpapatakbo ng script nang direkta ayon sa shebang ay walang paraan upang ipahiwatig kung aling bersyon ng interpreter ang gagamitin, na maaaring kailanganin. Kung patakbuhin mo ang interpreter sa halip at ipasa ang script bilang isang parameter, alam mo kung aling bersyon nito ang tumatakbo.

    Halimbawa sa Python, kung ang shebang ay #! / Usr / bin / python2.4 ang programa ay tatakbo nang iba kaysa sa kung ito ay #! / Usr / bin / python2.6 o kung ito ay #! / Usr / bin / python (na kung saan ay karaniwang isang simbolikong link sa bersyon ng Python na na-install at na-configure bilang default). Nangyayari ito dahil ang Python 2.6 ay may bagong pag-andar na wala sa Python 2.4, kaya ang pagsusulat ng isang script na gumagamit ng pagpapaandar na iyon na nagpapahiwatig ng isang #! / Usr / bin / python shebang ay mabibigo kung ang python 2.4 lamang ang na-install ng system. Sa halip, maaari mong laging pilitin ang script na tumakbo kasama ang bersyon ng sawa na gusto mo sa pamamagitan ng pagsisimula nito sa "python2.4 /path/al/script.py" o "python2.6 /path/al/script.py /

    Para sa mga script ng shell, mayroon ding mga pagkakaiba sa pagitan ng mga shell na ginagamit mo, kaya ang paggamit ng #! / Bin / sh at #! / Bin / bash ay maaaring magkaroon ng magkakaibang mga resulta depende sa script. Kung sumulat ka ng isang script gamit ang mga tampok na umiiral lamang sa bash ngunit ipahiwatig ang isang shebang #! / Bin / sh, ang iyong script ay maaaring gumana sa Linux (sa karamihan ng mga pamamahagi / bin / sh ay isang simbolikong link sa bash) ngunit marahil ay mabibigo ito sa iba pang mga UNIX kung saan ang bash ay hindi na-install o kung saan / bin / sh ay hindi isang simbolikong link sa / bin / bash.

    Kaugnay din sa kakayahang dalhin, dapat isaalang-alang na ang landas na ipinahiwatig sa shebang ay ganap, at may mga oras na naka-install ang mga interpreter sa iba pang mga lugar. Halimbawa, karaniwan na mai-install ang interpreter ng python sa / usr / local / bin / python kung na-download at naipon mo ang Python sa halip na gumamit ng isang pakete mula sa iyong pamamahagi. Kung ang iyong shebang ay #! / Usr / bin / python, hindi gagana ang script sa mga system na iyon. Upang subukang iwasan ang mga problemang ito, maaari mong gamitin bilang shebang "#! / Usr / bin / env python" (o "#! / Usr / bin / env sh") tulad ng ipinaliwanag sa http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   Gumamit tayo ng Linux dijo

    Salamat Jonathan! Mabuti na makita ka na!
    Cheers! Paul

  18.   Antonio dijo

    Wala kahit saan ang nais kong malaman, o kahit papaano hindi ko alam kung paano ito itaas sa search engine, nais kong lumikha ng isang script na sa isang kadahilanang xX ay nagpapatupad ng utos ng utos o «su» (ito ay isang halimbawa lamang ngunit sila ang 2 mga kaso na naiisip ko) at sa kaso ng kaalaman minsan hinihiling nito sa akin na ipasok ang "yon" o sa "su" hinihiling nito sa akin ang password ... Gusto kong piliin ng script ang mga pagpipiliang ito awtomatiko alinman sa pamamagitan ng pagpasa ng isang parameter o paggamit ng ilang pamamaraan na hindi nito alam .... Salamat para sa atensyon

    1.    gumamit tayo ng linux dijo

      Kumusta Antonio! Kung ang iyong problema ay kinakailangang ipasok ang password, sa palagay ko walang solusyon. Tiyak na dahil ito ay isang hakbang sa seguridad, upang hindi lahat ay maaaring mag-install ng isang programa.
      Tungkol sa kakayahan at kinakailangang ilagay sa oo, sa palagay ko malulutas ito. Hindi ko naaalala sa puntong ito ang eksaktong parameter na gagamitin, ngunit alamin lamang sa mga pahina ng tao. Magbukas ng isang terminal at ipasok ang utos: aptitude ng tao.
      Yakap! Paul

  19.   David M.M. dijo

    Napakagandang post.
    Lalo kong nagustuhan - sa post na ito- na ang tanong / pagdududa na lumitaw ay sinasagot nang napakalinaw at maikli.