Mitä eroa on käynnissä olevan “ bash script.sh ” ja “ ./script välillä .sh ”?

Jos script.sh on vain jotain tyypillistä, kuten

#!/bin/bash echo "Hello World!" 

Onko suositeltavaa tapa suorittaa komentosarja? Luulen, että sinun on ensin chmodettava se, jotta siitä tulee suoritettava?

Vastaa

Kummallakin tavalla skripti toimii, paitsi että ./script.sh vaatii suorituksen ja luettavia bittejä, kun taas bash script.sh vaatii vain luettavan bitin.


Syy käyttöoikeusvaatimusero on siinä, miten komentosarjasi tulkitseva ohjelma ladataan:

  • ./script.sh saa komentotulkin ajamaan tiedostoa ikään kuin se olisi tavallinen suoritettava.

Kuori haarautuu ja käyttää järjestelmäkutsu (esim. execve) saadakseen käyttöjärjestelmän suorittamaan tiedoston haarautuneessa prosessissa. Käyttöjärjestelmä tarkistaa tiedoston oikeudet (joten suoritusbitti on asetettava) ja välittää pyynnön -ohjelman lataajalle , joka tarkastelee tiedostoa ja määrittää, miten se suoritetaan. Linuxissa käännetyt suoritustiedostot alkavat ELF -numerolla, kun taas komentosarjat alkavat #! ( hashbang ). Hashbang-otsikko tarkoittaa, että tiedosto on komentosarja ja hashbangin jälkeen määritetty ohjelma on tulkittava se. Tämä sallii komentosarjan itsensä kertomaan järjestelmälle, miten komentosarja tulkitaan.

Komentosarjallesi ohjelman latausohjelma suorittaa /bin/bash ja välittää ./script.sh komentoriviargumenttina.

  • bash script.sh saa kuoren ajamaan bash ja siirtämään script.sh komentoriviargumenttina

Joten käyttöjärjestelmä lataa (edes katsomalla script.sh, koska se on vain komentoriviargumentti). Luotu prosessi bash tulkitsee sitten script.sh, koska se on ohitettu komentoriviargumenttina. Koska script.sh lukee vain bash tavallisena tiedostona, suoritusbittiä ei vaadita.


Suosittelen käyttämään ./script.sh, koska et ehkä tiedä, mitä tulkkia komentosarja tarvitsee. Anna sen siis ladata ohjelman ladata.

Kommentit

  • Jos suoritettavaa bittiä ei ole asetettu, voit suorittaa komentosarjan myös tekemällä " ./script.sh"
  • @Dog Olet oikeassa. Piste on pikakuvake sisäänrakennetulle komennolle ' source ' , joka suorittaa komentosarjan nykyisessä bash-prosessissa. Joten vain luettava bitti vaaditaan.
  • @Dogeatcatworld, vaikka se on totta, . ./script.sh -toiminnon suorittaminen ei ole sama asia kuten (tai ./script.sh. Harkitse komentosarjaa #!/usr/bin/python -V < newline > print test.
  • Varo, että komentosarjan hankinta voi johtaa interaktiivisen istunnon saastumiseen. Jos komentosarja esimerkiksi muuttaa PATH-ympäristömuuttujaa, tämä muutos vaikuttaa lähdettä seuraaviin komentoihin. Tämän lähestymistavan tulisi todella olla varattu tilanteille, joissa olet riippuvainen sivuvaikutuksista (ympäristöasetusohjelmat ja vastaavat). Muissa tilanteissa, joissa ' ei voi muuttaa käyttöoikeuksia, komento suoritetaan shebang-rivillä komentosarjan nimen jälkeen on turvallisin tapa.
  • Huomaa, että , jos lähdet komentosarjan nykyiseen hakemistoon, sinun ei tarvitse käyttää ./ ; sano vain . script.sh. Olen kuitenkin samaa mieltä ihmisten kanssa, jotka eivät halua käyttää . -komentoa komentosarjoissa, joita ei ole tarkoitus käyttää tällä tavalla. Olen yllättynyt siitä, että kukaan ei maininnut, että jos komentosarja sisältää exit -komentoja ja sinä hankit sen, se voi kirjautua ulos. Vähemmän vakava ongelma olisi, jos komentosarja tekisi cd, koska se vaikuttaisi myös vanhempaan (interaktiiviseen) kuoreen.

Vastaus

bash script.sh kutsuu komentosarjan suoraan bashin avulla.
./script.sh määrittää shebang #!/bin/bash -sovelluksen suorittamisen.

Jos todella haluat tietää, mikä binääritiedosto suoritetaan, jos teet bash script.sh saat selville which bash.

Joten esimerkissäsi ei ole merkitystä. Kyllä, sinun on chmod +x script.sh voidaksesi suorittaa sen suoraan ./script.sh -palvelun kautta.

Kommentit

  • Ei ole väliä, jos oletetaan, että /bin/bash on ensimmäinen bash $PATH -palvelussa.
  • Olet ' oikeassa. Ja shebang #!/bin/bash toimii vain, jos tietokoneessani on /bin/bash
  • Bash (versio 4.2.37) järjestelmä suorittaa komentosarjoja myös ilman suoritusbittiä. Miksi sanot suoritusbitin olevan pakollinen?
  • Kyllä, suoritusbittiä tarvitaan vain kutsumalla kautta ./script.sh.

Vastaa

Luo tiedosto Delete_Self.sh näin:

 #!/bin/rm echo I am still here! 

Suorita tämä komentosarjan nimellä sh Delete_Self.sh näet ”Olen edelleen täällä!” kaikui takaisin.

Tee se suoritettavaksi ja suorita se nimellä ./Delete_Self.sh. Et näe mitään vastaavaa, kun taas tiedosto Delete_Self.sh itsestään on kadonnut.

Ero on siis siinä, että:

  • bash script.sh jätetään huomioimatta #! rivillä, koska bash on määritetty ohjelmaksi script.sh: n suorittamiseksi.
  • ./script.sh lukee #! rivi ohjelman määrittämiseksi suoritettavaksi script.sh.

Kommentit

  • +1 käyttäjälle mukava esimerkki

Vastaa

Muiden vastausten lisäksi tietää eron komentosarjan suorittamisen välillä ./script.sh (i) ja lähde ./script.sh (ii) on hyödyllinen – (i) -versio luo uuden kuoren, jossa komento suoritetaan, (ii) suorittaa sen nykyisessä kuoressa – mikä voi olla pakollista, jos suoritettava tiedosto muuttaa ympäristömuuttujia, jotka on säilytettävä suoritettavan suorituksen jälkeen. Esimerkiksi python-conda-ympäristön aktivoimiseksi on käytettävä seuraavaa:

source activate my_env 

N.B. Toinen vaihtoehto kohdata source on . sisäänrakennettu eli

. activate my_env 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *