как вызвать скрипт shell из другого скрипта shell?

<p>у меня есть два сценария оболочки, <code>a.sh</code> и <code>b.sh</code>.</p><p>как я могу вызвать <code>b.sh</code> из скрипта оболочки <code>a.sh</code>?</p>

<p>есть несколько способов сделать это:</p><ol> <li><p>сделайте другой сценарий исполняемым, добавьте строку <code>#!/bin/bash</code> вверху и путь к файлу к переменной среды $ path. тогда вы можете вызвать его как обычную команду; или вызовите его с помощью команды source (псевдоним .), например: source /path/to/script; или используйте команду bash для ее выполнения: /bin/bash /path/to/script; первый и третий методы выполняют скрипт как другой процесс, поэтому переменные и функции в другом скрипте не будут доступны. второй метод выполняет сценарий в процессе первого сценария и извлекает переменные и функции из другого сценария, чтобы их можно было использовать из вызывающего сценария. во втором методе, если вы используете exit во втором скрипте, он также выйдет из первого скрипта. что не произойдет в первом и третьем способах.

проверь это.#!/bin/bash echo "this script is about to run another script." sh ./script.sh echo "this script has just run another 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") <strong> все это правильно для пути с пробелами !!! </strong>

ответ, который я искал:( exec "path/to/script" ) как уже упоминалось, exec заменяет оболочку без создания нового процесса.<strong> однако </strong>, мы можем поместить это в подоболочку, что делается с помощью парантезов. правка: на самом деле ( "path/to/script" ) достаточно.

вы можете использовать /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 

зависит от . кратко ... если вы хотите загрузить переменные на текущей консоли и выполнить, вы можете использовать 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 </code></pre><p>если вы просто хотите выполнить файл, и единственное, что вас интересует - это результат, вы можете сделать:</p><pre><code>!#/bin/bash set -x ./executing\_only.sh sh i\_can\_execute\_this\_way\_too.sh bash or\_this\_way.sh set +x </code></pre><p>я надеюсь, что поможет вам .... спасибо.</p>

<p>просто добавьте в строку все, что вы набрали бы в терминале, чтобы выполнить скрипт!<br> например.:</p><pre><code>#!bin/bash ./myscript.sh & </code></pre><p>если скрипт, который нужно выполнить, не находится в той же директории, просто используйте полный путь скрипта.<br> например ::`/home/user/script-directory/./myscript.sh &</p>

<p>простой источник поможет вам . например.</p><pre><code>#!/bin/bash echo "my shell\_1" source my\_script1.sh echo "back in shell\_1" </code></pre>

<p>сначала вы должны включить файл, который вы называете:</p><pre><code>#!/bin/bash . includes/included\_file.sh </code></pre><p>тогда вы вызываете свою функцию так:</p><pre><code>#!/bin/bash my\_called\_function </code></pre>

<pre><code>pathtoshell="/home/praveen/" chmod a+x $pathtoshell"myshell.sh" sh $pathtoshell"myshell.sh" </code></pre>

<pre><code> #!/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=$? 

предположим, что новый файл "/ home/satya/app/app_specific_env" и содержимое файла выглядит следующим образом#!bin/bash export fav_number="2211" добавить ссылку на этот файл в файл ~/.bashrcsource /home/satya/app/app_specific_env каждый раз, когда вы перезагружаете машину или перезагружаетесь, попробуйте echo $fav\_number</code> в терминале. это выведет значение. </p><p>на всякий случай, если вы хотите увидеть эффект сразу, <code>source ~/.bashrc</code> в командной строке.</p>

<pre><code>chmod a+x /path/to/file-to-be-executed </code></pre><p>это было единственное, что мне было нужно. когда выполняемый скрипт становится исполняемым, как это, вам (по крайней мере, в моем случае) не нужны никакие другие дополнительные операции, такие как <code>sh</code> или <code>./</code>, когда вы вызываете скрипт.</p><p>благодаря комментарию @nathan lilienthal </p>

<p>используйте backticks.</p><pre><code>$ ./script-that-consumes-argument.sh sh script-that-produces-argument.sh затем извлеките выходные данные сценария производителя в качестве аргумента сценария потребителя.

верхний ответ предполагает добавление строки #!/bin/bash в первую строку вызываемого подпрограммы. но даже если вы добавите шебанг, это намного быстрее запустить скрипт в суб-оболочке и записать вывод:$(source script\_name)</code> </p><p>это работает, когда вы хотите продолжать работать с одним и тем же интерпретатором (например, от bash до другого сценария bash) и гарантирует, что строка shebang подпрограммы не будет выполнена.</p><p>например:</p><pre><code>#!/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 </code></pre><p>результат:</p><pre><code>~ ❯❯❯ 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 </code></pre><hr><p><sup>*</sup> например, когда на устройстве запущены средства защиты от вирусов или вирусов, для запуска нового процесса могут потребоваться дополнительные 100 мс.</p>

<p>есть проблемы с импортом функций из другого файла.<br> <strong> первый </strong>: вам не нужно делать этот файл исполняемым. лучше не делать этого! просто добавьте </p><pre><code>. file </code></pre><p>импортировать все функции. и все они будут, как если бы они были определены в вашем файле.<br> <strong> второй </strong>: вы можете определить функцию с тем же именем. это будет перезаписано. это плохо. вы можете заявить, что так</p><pre><code>declare -f new\_function\_name=old\_function\_name </code></pre><p>и только после этого выполните импорт . таким образом, вы можете вызывать старую функцию под новым именем.<br> <strong> третий </strong>: вы можете импортировать только полный список функций, определенных в файле . если некоторые из них не нужны, вы можете отменить их. но если вы переписываете свои функции после сброса, они будут потеряны. но если вы установите ссылку на него, как описано выше, вы можете восстановить после сброса с тем же именем.<br> <strong> наконец </strong>в общем процедура импорта ввоза опасна и не так проста. быть осторожен! вы можете написать скрипт, чтобы сделать это более простым и безопасным .. если вы используете только часть функций (не все), лучше разбейте их на разные файлы. к сожалению, эта техника не очень хорошо работает в bash. например, в python и некоторых других языках сценариев это просто и безопасно. возможен частичный импорт только необходимых функций со своими именами. мы все хотим, чтобы в следующих версиях куста была сделана та же функциональность. но теперь мы должны написать много дополнительных кодов, чтобы делать то, что вы хотите. </p>