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.

  • @glennjackman Nekem is hasonló problémám van, és kipróbáltam a megoldásodat, de kijelentkeztet a héjból, amikor . vagy source. Miért van ez pening?
  • @Patryk: lehet, hogy a szkripted rendelkezik exit utasítással, ezért nem alkalmas forrásszerzésre.
  • Míg a 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?
  • @ 71GA: a 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.

    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