bash - with - shell script to create another shell script
How to call shell script from another shell script? (11)
I have two shell scripts,
How can I call
b.sh from within the shell script
Assume the new file is "/home/satya/app/app_specific_env" and the file contents are as follows
#!bin/bash export FAV_NUMBER="2211"
Append this file reference to ~/.bashrc file
When ever you restart the machine or relogin, try
echo $FAV_NUMBER in the terminal. It will output the value.
Just in case if you want to see the effect right away,
source ~/.bashrc in the command line.
Check this out.
#!/bin/bash echo "This script is about to run another script." sh ./script.sh echo "This script has just run another script."
First you have to include the file you call:
#!/bin/bash . includes/included_file.sh
then you call your function like this:
Just add in a line whatever you would have typed in a terminal to execute the script!
#!bin/bash ./myscript.sh &
if the script to be executed is not in same directory, just use the complete path of the script.
The answer which I was looking for:
( exec "path/to/script" )
exec replaces the shell without creating a new process. However, we can put it in a subshell, which is done using the parantheses.
( "path/to/script" ) is enough.
The top answer suggests adding
#!/bin/bash line to the first line of the sub-script being called. But even if you add the shebang, it is much faster* to run a script in a sub-shell and capture the output:
This works when you want to keep running the same interpreter (e.g. from bash to another bash script) and ensures that the shebang line of the sub-script is not executed.
#!/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
~ ❯❯❯ 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
* For example when virus or security tools are running on a device it might take an extra 100ms to exec a new process.
There are a couple of ways you can do this. Terminal to execute the script:
#!/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")
All this is correct for the path with spaces!!!
There are some problems to import functions from other file.
First: You needn't to do this file executable. Better not to do so! just add
to import all functions. And all of them will be as if they are defined in your file.
Second: You may be define the function with the same name. It will be overwritten. It's bad. You may declare like that
declare -f new_function_name=old_function_name
and only after that do import.
So you may call old function by new name.
Third: You may import only full list of functions defined in file. If some not needed you may unset them. But if you rewrite your functions after unset they will be lost. But if you set reference to it as described above you may restore after unset with the same name.
Finally In common procedure of import is dangerous and not so simple. Be careful! You may write script to do this more easier and safe. If you use only part of functions(not all) better split them in different files. Unfortunately this technique not made well in bash. In python for example and some other script languages it's easy and safe. Possible to make partial import only needed functions with its own names. We all want that in next bush versions will be done the same functionality. But now We must write many additional cod so as to do what you want.
You can use
/bin/sh to call or execute another script (via your actual 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
The output would be:
# ./mainscript.sh You are login as: root Date is: Thu Oct 17 02:56:36 EDT 2013
#!/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=$?
pathToShell="/home/praveen/" chmod a+x $pathToShell"myShell.sh" sh $pathToShell"myShell.sh"