Ik heb meerdere Amazon EC2-accounts en wil snel variabelen kunnen wisselen, zoals $EC2_HOME
, met een script.
Ik heb een shellscript als volgt opgezet:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
Als ik het script draai, weet ik dat EC2_HOME
is ingesteld, maar ik dacht dat het gebruik van export
ervoor zou zorgen dat de variabele blijft hangen nadat het script is voltooid. Dat doet het niet, aangezien het draaien van echo $EC_HOME
niets laat zien.
Ik weet dat dit een zeer rudimentaire Linux-scriptkennis moet zijn, maar ik weet het niet. probeerde zonder geluk naar gerelateerde vragen te zoeken – dus mijn excuses als dit een duplicaat is.
Antwoord
Je moet je script zoeken, met
. ./script
of
source ./script
Reacties
- de reden is dat je script een nieuw shell-proces voortbrengt als een kind van de huidige shell. Wijzigingen in de omgeving die je aanbrengt in het onderliggende proces kunnen geen invloed hebben op de ouder. Wanneer je
.
ofsource
, je brengt geen nieuw kindproces voort, je voert de opdrachten uit in de huidige shell. - @glennjackman Ik heb een soortgelijk probleem en ik heb je oplossing geprobeerd, maar het logt me uit van de shell als ik
.
ofsource
doe. Waarom is dit gebeurd pening? - @Patryk: misschien heeft uw script een
exit
-instructie, dus het is niet geschikt om als bron te worden gebruikt. - Terwijl
source ./script
werkt prima,sudo source ./script.sh
zegtsudo: source: command not found
. Hoe kan ik dit doen met sudo? - @ 71GA: afhankelijk van de compilatievoorkeuren voor
sudo
en afhankelijk van de configuratie-instellingen in/etc/sudoers
u kunt uw omgeving wel of niet behouden wanneer u opdrachten uitvoert metsudo
. Ik raad je aan om te proberen je script te sourcen en vervolgenssudo
uit te voeren met de optie-E
om de omgeving te behouden. Als het niet werkt, denk ik dat je maar heel weinig kunt doen.
Answer
Wanneer je rent een script krijgt het een eigen shell en een eigen omgeving, die weer verdwijnen zodra het script af is. Om de omgevingsvariabelen te behouden, plaatst u het script in uw huidige shell:
$ source ./a.sh
of equivalent (maar iets meer draagbaar) gebruikt u de POSIX-puntopdracht :
$ . ./a.sh
Vervolgens worden de definities in uw huidige shell-omgeving geplaatst en overgenomen door alle programmas die u ermee start.
Om dichter bij het uitvoeren van een script te komen, . a.sh
vindt a.sh door te zoeken in de mappen in de PATH
omgevingsvariabele.
Er zijn enkele subtiliteiten in hoe deze zich gedragen, en of .
en source
zijn hetzelfde (of helemaal aanwezig). . ./a.sh
zal zich zeker hetzelfde gedragen in elke POSIX-compatibele shell, maar source
en .
, en . a.sh
en . ./a.sh
, kunnen variëren . Voor Bash source
en .
zijn in alle gevallen hetzelfde ; voor zsh source
controleert altijd eerst de huidige directory ; ksh is in wezen vergelijkbaar.
Als de scriptnaam wordt opgegeven als een pad (met een /
), wordt dat pad direct gebruikt in alle gevallen. Het meest draagbaar betrouwbare ding om te doen is . ./script
of . /path/to/script
.
Antwoord
Voor de goede orde.
Als u een script van internet wilt uitvoeren dat env naar het systeem exporteert
, kunt u het volgende formaat gebruiken
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
Bijvoorbeeld:
source <(curl -s -L https://example.com/install.sh)
Reacties
- Ziet er gevaarlijk uit, maar nuttig als je dat script vertrouwt!
Antwoord
Probeer
exec ./script
Het exec-commando voert het script uit in de huidige shell zonder de niet-interactieve shell te starten.