Jaký je rozdíl mezi spuštěním skriptu, jako je tento:
./test.sh
a provedení skriptu, jako je tento:
. test.sh ?
Zkoušel jsem jednoduchý dvouřádkový skript, abych zjistil, zda je v tom rozdíl:
#!/bin/bash
ls
Ale oba . test.sh a ./test.sh vrátil stejné informace.
Přijatá odpověď:
./test.sh spustí test.sh jako samostatný program. Může se stát, že jde o bash skript, pokud je soubor test.sh začíná #!/bin/bash . Ale mohlo by to být něco úplně jiného.
. ./test.sh spustí kód souboru test.sh uvnitř běžící instance bash. Funguje jako by obsahový soubor test.sh byl zahrnut textově namísto $BASH_LINENO a chování návratu vestavěný.)
zdroj ./test.sh je identický s . ./test.sh v bash (v jiných shellech zdroj může se mírně lišit nebo vůbec neexistuje; . pro zahrnutí je ve standardu POSIX).
Nejčastěji viditelný rozdíl mezi spuštěním samostatného skriptu s ./test.sh a včetně skriptu s . vestavěný je, že pokud test.sh skript nastavuje některé proměnné prostředí, u samostatného procesu se nastavuje pouze prostředí podřízeného procesu, zatímco při zahrnutí skriptu se nastavuje prostředí jediného procesu shellu. Pokud přidáte řádek foo=bar v test.sh a echo $foo na konci volajícího skriptu uvidíte rozdíl:
$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo
$ . ./test.sh
$ echo $foo
bar