Több Amazon EC2-fiókkal rendelkezem, és gyorsan váltani szeretnék, például $EC2_HOME
egy szkript.
Van egy shell szkriptem, amely így van beállítva:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
A szkript futtatásakor tudom, hogy EC2_HOME
be van állítva, de úgy gondoltam, hogy a export
használatával a változó megmarad a szkript befejezése után. Nem, mivel a echo $EC_HOME
futtatása nem mutat semmit.
Tudom, hogy ennek nagyon kezdetleges Linux szkript-tudásnak kell lennie, de nem tudom. megpróbáltam kapcsolódó kérdéseket keresni szerencse nélkül – ezért elnézését kérem, ha ez duplikátum.
Válasz
Forrja meg a szkriptet, a
. ./script
vagy
source ./script
megjegyzésekkel
- ennek az az oka, hogy a szkript új shell folyamatot hoz létre az aktuális shell gyermekeként. A gyermek folyamatban végrehajtott bármilyen környezeti változás nem befolyásolhatja a szülőt. div id = “323cc66047″>
vagy source
, nem új gyermek folyamatot szül, hanem az aktuális héjban futtatja a parancsokat.
.
vagy source
. Miért van ez pening? exit
utasítással, ezért nem alkalmas forrásszerzésre. source ./script
teljesen jól működik, sudo source ./script.sh
azt mondja, hogy sudo: source: command not found
. Hogyan tudom ezt megtenni a sudo használatával? sudo
fordítási beállításaitól és a /etc/sudoers
megőrizheti vagy nem tudja megőrizni a környezetét, amikor parancsokat futtat a sudo
paranccsal. Javaslom, próbálja meg beszerezni a szkriptet, majd futtassa az sudo
parancsot a -E
opcióval a környezet megőrzése érdekében. Ha nem működik, akkor feltételezem, hogy nagyon keveset tehet. Válasz
Amikor fut egy szkript, amely megkapja a saját shelljét és a saját környezetét, amelyek azonnal eltűnnek, amint a szkript befejeződik. A környezeti változók körülvétele érdekében a parancsfájlt az aktuális shellbe kell forrni:
$ source ./a.sh
vagy ezzel egyenértékűen (de kicsit hordozhatóbban) használja a POSIX dot parancs :
$ . ./a.sh
Ezután a definíciók az aktuális shell környezetébe kerülnek és öröklődnek bármelyik általa elindított program által.
Ahhoz, hogy közelebb kerüljünk egy szkript futtatásához, a . a.sh
megtalálja az a.sh fájlt a PATH
környezeti változó.
Vannak olyan finomságok, amelyekben ezek viselkednek, és hogy .
és source
ugyanazok (vagy egyáltalán vannak). . ./a.sh
minden POSIX-kompatibilis shellben mindenképpen ugyanúgy fog viselkedni, de source
és .
, és . a.sh
és . ./a.sh
változhatnak . Bash esetében: source
és .
minden esetben ugyanaz ; mert a zsh source
mindig először ellenőrzi az aktuális könyvtárat ; A ksh lényegében hasonló.
Ha a szkript neve elérési útként van megadva (/
-et tartalmaz), akkor ezt az utat közvetlenül használják minden esetben. A hordozhatóság szempontjából a legmegbízhatóbb a következő: . ./script
vagy . /path/to/script
.
Válasz
Csak nyilvántartás céljából.
Ha az internetről akarsz futtatni parancsfájlt, amely az env-t exportálja a rendszerbe
a következő formátumot használhatod
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
Például:
source <(curl -s -L https://example.com/install.sh)
megjegyzések
- Veszélyesnek, de hasznosnak tűnik, ha megbízik abban a szkriptben!
Válasz
Próbálja
exec ./script
Az exec parancs az interaktív shell indítása nélkül futtatja a parancsfájlt az aktuális héjban.