Hoe een shellscript aanroepen vanuit een ander shellscript?

Ik heb twee shellscripts, a.shen b.sh.

Hoe kan ik b.shaanroepen vanuit het shellscript a.sh?


Antwoord 1, autoriteit 100%

Er zijn een aantal verschillende manieren waarop u dit kunt doen:

  1. Maak het andere script uitvoerbaar, voeg de regel #!/bin/bashbovenaan toe, en het pad waar het bestand zich bevindt naar de omgevingsvariabele $PATH. Dan kun je het een normaal commando noemen;

  2. Of roep het aan met het sourcecommando (alias is .) als volgt: source /path/to/script;

  3. Of gebruik de opdracht bashom het uit te voeren: /bin/bash /path/to/script;

De eerste en derde methode voeren het script uit als een ander proces, dus variabelen en functies in het andere script zijn niet toegankelijk.
De tweede methode voert het script uit in het proces van het eerste script en haalt variabelen en functies uit het andere script op zodat ze bruikbaar zijn vanuit het aanroepende script.

Als je bij de tweede methode exitgebruikt in het tweede script, wordt het eerste script ook afgesloten. Wat niet zal gebeuren in de eerste en derde methode.


Antwoord 2, autoriteit 22%

Bekijk dit.

#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."

Antwoord 3, autoriteit 13%

Er zijn een aantal manieren waarop u dit kunt doen. Terminal om het script uit te voeren:

#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"
# Here you execute your script
"$SCRIPT_PATH"
# or
. "$SCRIPT_PATH"
# or
source "$SCRIPT_PATH"
# or
bash "$SCRIPT_PATH"
# or
eval '"$SCRIPT_PATH"'
# or
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT
# or
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT
# or
("$SCRIPT_PATH")
# or
(exec "$SCRIPT_PATH")

Dit is allemaal correct voor het pad met spaties!!!


Antwoord 4, autoriteit 6%

Het antwoord dat ik zocht:

( exec "path/to/script" )

Zoals gezegd vervangt execde shell zonder een nieuw proces aan te maken. Echterkunnen we het in een subshell plaatsen, wat wordt gedaan met behulp van de haakjes.

BEWERKEN:
Eigenlijk is ( "path/to/script" )voldoende.


Antwoord 5, autoriteit 3%

Als u een ander bestand in dezelfde map heeft, kunt u het volgende doen:

bash another_script.sh

of

source another_script.sh

of

. another_script.sh

Als je bashgebruikt in plaats van source, kan het script de omgeving van het bovenliggende script niet wijzigen. De opdracht .is standaard POSIX, terwijl de opdracht sourceeen beter leesbaar bash-synoniem is voor .(ik geef de voorkeur aan sourceboven .). Als uw script zich ergens anders bevindt, geeft u het pad naar dat script op. Zowel relatief als volledig pad zou moeten werken.


Antwoord 6, autoriteit 2%

Afhankelijk van.
Kort…
Als u variabelen op de huidige console wilt laden en uitvoeren, kunt u source myshellfile.shin uw code gebruiken. Voorbeeld:

!#/bin/bash
set -x
echo "This is an example of run another INTO this session."
source my_lib_of_variables_and_functions.sh
echo "The function internal_function() is defined into my lib."
returned_value=internal_function()
echo $this_is_an_internal_variable
set +x

Als u alleen een bestand wilt uitvoeren en het enige dat voor u interessant is, is het resultaat, dan kunt u het volgende doen:

!#/bin/bash
set -x
./executing_only.sh
sh i_can_execute_this_way_too.sh
bash or_this_way.sh
set +x

Ik hoop dat het je helpt.
Bedankt.


Antwoord 7

Je kunt /bin/shgebruiken om een ander script aan te roepen of uit te voeren (via je eigenlijke script):

# cat showdate.sh
 #!/bin/bash
 echo "Date is: `date`"
 # cat mainscript.sh
 #!/bin/bash
 echo "You are login as: `whoami`"
 echo "`/bin/sh ./showdate.sh`" # exact path for the script file

De uitvoer zou zijn:

# ./mainscript.sh
 You are login as: root
 Date is: Thu Oct 17 02:56:36 EDT 2013

Antwoord 8

Voeg gewoon in een regel toe wat u in een terminal zou hebben getypt om het script uit te voeren!
bijv.:

#!bin/bash
./myscript.sh &

als het uit te voeren script niet in dezelfde map staat, gebruik dan gewoon het volledige pad van het script.
bijv.:`/home/user/script-directory/./myscript.sh &


Antwoord 9

Eerst moet u het bestand opnemen dat u aanroept:

#!/bin/bash
. includes/included_file.sh

dan roept u uw functie als volgt aan:

#!/bin/bash
my_called_function

Antwoord 10

Eenvoudige bron zal u helpen.
Bijv.

#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"

Antwoord 11

Dit was wat voor mij werkte, dit is de inhoud van het belangrijkste sh-script dat het andere uitvoert.

#!/bin/bash 
source /path/to/other.sh

Antwoord 12

Het bovenste antwoord stelt voor om de regel #!/bin/bashtoe te voegen aan de eerste regel van het subscript dat wordt aangeroepen. Maar zelfs als je de shebang toevoegt, is het veel sneller*om een script in een sub-shell uit te voeren en de uitvoer vast te leggen:

$(source SCRIPT_NAME)

Dit werkt als je dezelfde interpreter wilt blijven uitvoeren (bijvoorbeeld van bash naar een ander bash-script) en zorgt ervoor dat de shebang-regel van het subscript niet wordt uitgevoerd.

Bijvoorbeeld:

#!/bin/bash
SUB_SCRIPT=$(mktemp)
echo "#!/bin/bash" > $SUB_SCRIPT
echo 'echo $1' >> $SUB_SCRIPT
chmod +x $SUB_SCRIPT
if [[ $1 == "--source" ]]; then
  for X in $(seq 100); do
    MODE=$(source $SUB_SCRIPT "source on")
  done
else
  for X in $(seq 100); do
    MODE=$($SUB_SCRIPT "source off")
  done
fi
echo $MODE
rm $SUB_SCRIPT

Uitvoer:

~ ❯❯❯ time ./test.sh
source off
./test.sh  0.15s user 0.16s system 87% cpu 0.360 total
~ ❯❯❯ time ./test.sh --source
source on
./test.sh --source  0.05s user 0.06s system 95% cpu 0.114 total

*Wanneer bijvoorbeeld virus- of beveiligingstools op een apparaat worden uitgevoerd, kan het 100 ms extra duren om een nieuw proces uit te voeren.


Antwoord 13

#!/bin/bash
 # Here you define the absolute path of your script
 scriptPath="/home/user/pathScript/"
 # Name of your script
 scriptName="myscript.sh"
 # Here you execute your script
 $scriptPath/$scriptName
 # Result of script execution
 result=$?

Antwoord 14

chmod a+x /path/to/file-to-be-executed

Dat was het enige wat ik nodig had. Zodra het uit te voeren script op deze manier uitvoerbaar is gemaakt, heb je (in mijn geval tenminste) geen andere extra bewerking nodig, zoals shof ./terwijl je bezig bent het script aanroepen.

Dankzij de reactie van @Nathan Lilienthal


Antwoord 15

pathToShell="/home/praveen/"   
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"

Antwoord 16

Stel dat het nieuwe bestand “/home/satya/app/app_specific_env” is en dat de inhoud van het bestand als volgt is

#!bin/bash
export FAV_NUMBER="2211"

Voeg deze bestandsverwijzing toe aan het ~/.bashrc-bestand

source /home/satya/app/app_specific_env

Als je de machine opnieuw opstart of opnieuw inlogt, probeer dan echo $FAV_NUMBERin de terminal. Het zal de waarde uitvoeren.

Voor het geval je het effect meteen wilt zien, source ~/.bashrcin de opdrachtregel.


Antwoord 17

Er zijn enkele problemen met het importeren van functies uit een ander bestand.
Eerst: u hoeft dit bestand niet uitvoerbaar te maken. Beter niet doen!
voeg gewoon

. toe

. file

om alle functies te importeren. En ze zullen allemaal zijn alsof ze in uw bestand zijn gedefinieerd.
Tweede: u kunt de functie met dezelfde naam definiëren. Het wordt overschreven. Het is slecht. Je mag zo declareren

declare -f new_function_name=old_function_name 

en pas daarna importeren.
U kunt de oude functie dus bij de nieuwe naam aanroepen.
Derde: u mag alleen de volledige lijst met functies importeren die in het bestand zijn gedefinieerd.
Als sommige niet nodig zijn, kunt u ze uitschakelen. Maar als u uw functies herschrijft nadat ze zijn uitgeschakeld, gaan ze verloren. Maar als u ernaar verwijst zoals hierboven beschreven, kunt u na het uitschakelen herstellen met dezelfde naam.
EindelijkIn de gebruikelijke procedure van import is gevaarlijk en niet zo eenvoudig. Doe voorzichtig! U kunt een script schrijven om dit gemakkelijker en veiliger te doen.
Als u slechts een deel van de functies (niet alle) gebruikt, kunt u ze beter in verschillende bestanden splitsen. Helaas is deze techniek niet goed gemaakt in bash. In python bijvoorbeeld en enkele andere scripttalen is het gemakkelijk en veilig. Mogelijk om gedeeltelijke import alleen noodzakelijke functies met eigen namen te maken. We willen allemaal dat in de volgende bush-versies dezelfde functionaliteit wordt gedaan. Maar nu moeten we veel extra kabeljauw schrijven om te doen wat je wilt.


Antwoord 18

Gebruik backticks.

$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`

Haal vervolgens de uitvoer van het producer-script op als argument op het consumer-script.

Other episodes