У меня есть два сценария оболочки, a.sh
и b.sh
.
Как я могу вызвать b.sh
из сценария оболочки a.sh
?
Есть несколько разных способов сделать это:
Сделайте другой скрипт исполняемым, добавьте #!/ bin / bash
строка вверху и путь, по которому файл находится к переменной среды $ PATH. Тогда вы можете назвать это обычной командой;
Или назовите его командой source
(псевдоним .
) вот так: source / path / to / script
;
Или используйте команду bash
, чтобы выполнить ее: / bin / bash / path / to / script
;
Первый и третий методы выполняют скрипт как другой процесс, поэтому переменные и функции в другом скрипте не будут доступны. Второй метод выполняет скрипт в процессе первого скрипта и извлекает переменные и функции из другого скрипта, чтобы их можно было использовать из вызывающего скрипта.
Во втором методе, если вы используете exit
во втором скрипте, он также выйдет из первого скрипта. Что не произойдет в первом и третьем методах.
Есть несколько способов сделать это. Терминал для выполнения скрипта:
#!/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")
Все это правильно для пути с пробелами!!!
Ответ, который я искал:
( exec "path/to/script" )
Как уже упоминалось, exec
заменяет оболочку без создания нового процесса. Однако мы можем поместить его в подгруппу, что делается с использованием паратезов.
РЕДАКТИРОВАТЬ:
На самом деле ( "путь / к / сценарий")
достаточно.
Зависит от.
Вкратце...
Если вы хотите загрузить переменные на текущую консоль и выполнить их, вы можете использовать source myshellfile.sh
в своем коде. Пример:
!#/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
Если вы просто хотите выполнить файл, и единственное, что вас интересует, это результат, вы можете сделать:
!#/bin/bash
set -x
./executing_only.sh
sh i_can_execute_this_way_too.sh
bash or_this_way.sh
set +x
Я надеюсь, поможет вам. Спасибо.
Вы можете использовать / bin / sh
для вызова или выполнения другого скрипта (через ваш фактический скрипт):
# 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
Выход будет:
# ./mainscript.sh
You are login as: root
Date is: Thu Oct 17 02:56:36 EDT 2013
Просто добавьте в строку все, что вы набрали бы в терминале для выполнения скрипта!& Лт; br > например.:
#!bin/bash
./myscript.sh &
если выполняемый скрипт не находится в том же каталоге, просто используйте полный путь к сценарию.& Лт; br > например.:` / home / user / script-directory /./myscript.sh &
Сначала вы должны включить файл, который вы вызываете:
#!/bin/bash
. includes/included_file.sh
тогда вы называете свою функцию следующим образом:
#!/bin/bash
my_called_function
Простой источник поможет вам. Для Ex.
#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"
Верхний ответ предлагает добавить #!/ bin / bash
строка первой строке вызываемого субсценария. Но даже если вы добавите шебанг, он будет намного быстрее * < / sup > запустить скрипт в подоболочке и захватить вывод:
$ (источник SCRIPT_NAME)
Это работает, когда вы хотите продолжать работать с одним и тем же интерпретатором (например,. от bash к другому сценарию bash) и гарантирует, что линия shebang субсценария не будет выполнена.
Например:
#!/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
* < / sup > < small > Например, когда на устройстве работают вирусы или инструменты безопасности, для запуска нового процесса может потребоваться дополнительно 100 мс.& Лт; / small >
#!/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"
Предположим, что новый файл "/ home / satya / app / app_specific_env", а содержимое файла выглядит следующим образом
#!bin/bash
export FAV_NUMBER="2211"
Добавьте эту ссылку на файл в файл ~/.bashrc
source /home/satya/app/app_specific_env
Когда вы перезагрузите компьютер или перезагрузите компьютер, попробуйте echo $ FAV_NUMBER
в терминале. Это выведет значение.
На всякий случай, если вы хотите сразу увидеть эффект, source ~/.bashrc
в командной строке.
chmod a+x /path/to/file-to-be-executed
Это было единственное, что мне было нужно. Как только исполняемый скрипт становится исполняемым, как это, вам (по крайней мере, в моем случае) не нужна какая-либо другая дополнительная операция, такая как sh
или ./
пока вы звоните в скрипт.
Благодаря комментарию @Nathan Lilienthal
Есть некоторые проблемы с импортом функций из другого файла. Во-первых : Вам не нужно делать этот файл исполняемым. Лучше не делать этого! просто добавь
. file
импортировать все функции. И все они будут такими, как если бы они были определены в вашем файле. Второй : Вы можете определить функцию с тем же именем. Это будет перезаписано. Плохо. Вы можете заявить об этом
declare -f new_function_name=old_function_name
и только после этого импортируйте. Таким образом, вы можете вызвать старую функцию под новым именем. Третий : Вы можете импортировать только полный список функций, определенных в файле. Если некоторые не нужны, вы можете отменить их. Но если вы переписаете свои функции после отмены, они будут потеряны. Но если вы установите ссылку на нее, как описано выше, вы можете восстановить после сброса с тем же именем. Наконец В общей процедуре импорта опасно и не так просто. Быть осторожен! Вы можете написать сценарий, чтобы сделать это проще и безопаснее. Если вы используете только часть функций (не все), лучше разделите их на разные файлы. К сожалению, эта техника не очень хорошо зарекомендовала себя в bash. Например, в Python и некоторых других языках сценариев это легко и безопасно. Можно сделать частичный импорт только необходимых функций со своими именами. Мы все хотим, чтобы в следующих версиях bush была сделана та же функциональность. Но теперь мы должны написать много дополнительной трески, чтобы делать то, что вы хотите.
Если у вас есть другой файл в том же каталоге, вы можете сделать:
bash another_script.sh
или
source another_script.sh
или
another_script.sh.```
Когда вы используете `bash` вместо `source`, скрипт не может изменить среду родительского скрипта. `.Команда `является стандартом POSIX, а команда `source` - более читаемым синонимом bash для `.`(Я предпочитаю« источник »над`.`). Если ваш скрипт находится в другом месте, просто укажите путь к этому сценарию. И относительный, и полный путь должен иметь мир.