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 futtatjabash
és átadjascript.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 “>
. ./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.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 ascript.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
/bin/bash
az elsőbash
a$PATH
csoportban.#!/bin/bash
csak akkor működik, ha van egy/bin/bash
./script.sh
útján történő meghívással van szükség.