Mi a különbség a “ bash script.sh ” és a “ ./script futtatása között .sh ”?

Ha a script.sh csak valami tipikus, például

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

a szkript futtatásának módja? Azt hiszem, először chmodot kell készítenie, hogy futtathatóvá váljon?

Válasz

Az Ön egyedi szkriptjéhez bármelyik módszer működni fog, kivéve hogy ./script.sh végrehajtást és olvasható biteket igényel, míg az bash script.sh csak olvasható biteket igényel.


az engedélyigény-különbség abban rejlik, hogy a szkriptet értelmező program hogyan töltődik be:

  • ./script.sh a shell úgy futtatja a fájlt, mintha az normális lenne futtatható.

A shell elágazik, és rendszerhívást (pl. execve) használ arra, hogy az operációs rendszer futtassa a fájlt a villás folyamatban. Az operációs rendszer ellenőrzi a fájl engedélyeit (ezért a végrehajtási bitet be kell állítani), és továbbítja a kérést a programbetöltőnek , amely a fájlt nézi Linuxban a lefordított futtatható fájlok ELF mágikus számmal kezdődnek, míg a szkriptek #! ( hashbang ). A hashbang fejléc azt jelenti, hogy a fájl egy szkript, és azt a hashbang után megadott programnak kell értelmeznie. maga mondja el a rendszernek, hogyan kell értelmezni a szkriptet.

A szkripteddel a program betöltője végrehajtja a /bin/bash fájlt, és átadja a ./script.sh parancssori argumentumként.

  • bash script.sh a shell-t futtatja bash és átadja script.sh mint parancssori argumentum

Tehát az operációs rendszer betölteni fogja a következőt: (nem is nézi a script.sh -et, mert ez csak parancssori argumentum). A létrehozott bash folyamat ekkor értelmezi a script.sh -et, mert parancssori argumentumként továbbadódik. Mivel fájlt csak bash olvassa el rendes fájlként, a végrehajtási bitre nincs szükség.


Javaslom a ./script.sh, mert lehet, hogy nem tudja, melyik tolmácsra van szükség a szkript számára. Tehát hagyja, hogy a programbetöltő meghatározza ezt az Ön számára. megjegyzések “>

  • Ha a futtatható bit nincs beállítva, akkor a szkriptet úgy is futtathatja, hogy " ./script.sh"
  • @Dog Ön igaza van. A pont a ' forrás ' beépített parancs parancsikonja , amely a szkriptet futtatja az aktuális bash folyamatban. Tehát csak az olvasható bitre van szükség.
  • @Dogeatcatworld, bár ez igaz, a . ./script.sh futtatása nem ugyanaz dolog, mint (vagy ./script.sh. Tekintsük a #!/usr/bin/python -V < newline > print test.
  • Vigyázzon, hogy egy szkript beszerzése az interaktív munkamenet szennyeződését eredményezheti. Például, ha egy szkript megváltoztatja a PATH környezeti változót, ez a változás hatással lesz a forrás után futó parancsokra. Ezt a megközelítést valóban azokra a helyzetekre kell fenntartani, ahol a mellékhatásoktól függenek (környezeti beállító szkriptek és hasonlók). Más helyzetekben, ahol ' nem módosíthatja az engedélyeket, a parancs futtatása a shebang sorban, a szkript neve követése a legbiztonságosabb megközelítés.
  • Ne feledje, hogy , ha egy parancsfájlt az aktuális könyvtárba szerez be, akkor nem kell használnia a ./ parancsot; csak mondja ki: . script.sh. De egyetértek azokkal az emberekkel, akik nem kedvelik a . parancs használatát olyan szkripteken, amelyeket nem úgy akartak meghívni. Meglepődtem, hogy senki sem említette, hogy ha a szkript exit parancsokat tartalmaz, és ha Ön forrást szerez rá, akkor kijelentkezhet. Kevésbé súlyos probléma lenne, ha a szkript cd t csinálna, mivel ez a szülő (interaktív) héjat is érintené.
  • Válasz

    bash script.sh közvetlenül a bash használatával hívja meg a szkriptet.
    ./script.sh a shebang #!/bin/bash paranccsal határozza meg a végrehajtás módját.

    Ha valóban tudni szeretné, melyik bináris fájl kerül végrehajtásra, ha bash script.sh megtudhatja a which bash használatával.

    Tehát a példájában nincs különbség. Igen, chmod +x script.sh szükséges ahhoz, hogy közvetlenül végrehajthassa a ./script.sh keresztül.

    Megjegyzések

    • Nos, nincs különbség feltételezve, hogy a /bin/bash az első bash a $PATH csoportban.
    • Önnek ' igaza van. És a shebang #!/bin/bash csak akkor működik, ha van egy /bin/bash
    • Bash (4.2.37 verzió) az én A rendszer parancsfájlokat hajt végre a végrehajtási bitek beállítása nélkül is. Miért mondod, hogy végrehajtási bitre van szükség?
    • Igen, a végrehajtási bitre csak a ./script.sh útján történő meghívással van szükség.

    Válasz

    Hozzon létre egy fájlt a Delete_Self.sh fájlról:

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

    Futtassa ezt szkript sh Delete_Self.sh néven látni fogja: “Még mindig itt vagyok!” visszhangzott.

    Tegye futtathatóvá, és futtassa ./Delete_Self.sh néven, és nem látja, hogy semmi visszhangzik, míg az Delete_Self.sh maga eltűnt.

    Tehát az a különbség, hogy:

    • bash script.sh figyelmen kívül hagyja a # -et! sor, mert a bash van megadva a script.sh futtatására szolgáló programként.
    • ./script.sh beolvassa a #! sor a script.sh futtatni kívánt program meghatározásához.

    Megjegyzések

    • +1 a jó példa

    Válasz

    A többi válasz mellett a különbség ismerete a szkript futtatása között a ./script.sh (i) és a forrás ./script.sh (ii) hasznos – Az (i) verzió új parancsfájlt hoz létre, amelyben a parancs futtatható, mivel (ii) az aktuális shellben futtatja – ami kötelező lehet, ha a futtatható megváltoztatja azokat a környezeti változókat, amelyeket meg kell őrizni a futtatható kilépés után. Például a python conda környezet aktiválásához a következőket kell használni:

    source activate my_env 

    N.B. A source másik alternatívája a . beépített, azaz

    . activate my_env 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük