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 . of source, 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 . of source 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 zegt sudo: 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 met sudo. Ik raad je aan om te proberen je script te sourcen en vervolgens sudo 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *