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 ajamaanbash
ja siirtämäänscript.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 tekisicd
, 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
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 suoritettavaksiscript.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
/bin/bash
on ensimmäinenbash
$PATH
-palvelussa.#!/bin/bash
toimii vain, jos tietokoneessani on/bin/bash
./script.sh
.