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.sha 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.sha shell-t futtatjabashés átadjascript.shmint 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 “>
. ./script.sh futtatása nem ugyanaz dolog, mint (vagy ./script.sh. Tekintsük a #!/usr/bin/python -V < newline > print test. . 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
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.shfigyelmen kívül hagyja a # -et! sor, mert a bash van megadva a script.sh futtatására szolgáló programként. -
./script.shbeolvassa a #! sor ascript.shfuttatni 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
/bin/bashaz elsőbasha$PATHcsoportban.#!/bin/bashcsak akkor működik, ha van egy/bin/bash./script.shútján történő meghívással van szükség.