Как вызвать сценарий оболочки из другого сценария оболочки?

У меня есть два сценария оболочки, a.sh и b.sh.

Как я могу вызвать b.sh из сценария оболочки a.sh?

Комментарии к вопросу (5)

Есть несколько разных способов сделать это:

  1. Сделайте другой скрипт исполняемым, добавьте #!/ bin / bash строка вверху и путь, по которому файл находится к переменной среды $ PATH. Тогда вы можете назвать это обычной командой;

  2. Или назовите его командой source (псевдоним .) вот так: source / path / to / script;

  3. Или используйте команду bash, чтобы выполнить ее: / bin / bash / path / to / script ;

Первый и третий методы выполняют скрипт как другой процесс, поэтому переменные и функции в другом скрипте не будут доступны. Второй метод выполняет скрипт в процессе первого скрипта и извлекает переменные и функции из другого скрипта, чтобы их можно было использовать из вызывающего скрипта.

Во втором методе, если вы используете exit во втором скрипте, он также выйдет из первого скрипта. Что не произойдет в первом и третьем методах.

Комментарии (12)

Проверь это.

#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
Комментарии (4)

Есть несколько способов сделать это. Терминал для выполнения скрипта:

#!/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")

Все это правильно для пути с пробелами!!!

Комментарии (3)

Ответ, который я искал:

( exec "path/to/script" )

Как уже упоминалось, exec заменяет оболочку без создания нового процесса. Однако мы можем поместить его в подгруппу, что делается с использованием паратезов.

РЕДАКТИРОВАТЬ: На самом деле ( "путь / к / сценарий")достаточно.

Комментарии (6)

Зависит от. Вкратце... Если вы хотите загрузить переменные на текущую консоль и выполнить их, вы можете использовать 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

Я надеюсь, поможет вам. Спасибо.

Комментарии (1)

Вы можете использовать / 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
Комментарии (2)

Просто добавьте в строку все, что вы набрали бы в терминале для выполнения скрипта!& Лт; br > например.:

#!bin/bash
./myscript.sh &

если выполняемый скрипт не находится в том же каталоге, просто используйте полный путь к сценарию.& Лт; br > например.:` / home / user / script-directory /./myscript.sh &

Комментарии (2)

Сначала вы должны включить файл, который вы вызываете:

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

тогда вы называете свою функцию следующим образом:

#!/bin/bash
my_called_function
Комментарии (0)

Простой источник поможет вам. Для Ex.

#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"
Комментарии (0)

Верхний ответ предлагает добавить #!/ 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 >
Комментарии (0)
 #!/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=$?
Комментарии (1)
pathToShell="/home/praveen/"   
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
Комментарии (0)

Предположим, что новый файл "/ 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 в командной строке.

Комментарии (0)
chmod a+x /path/to/file-to-be-executed

Это было единственное, что мне было нужно. Как только исполняемый скрипт становится исполняемым, как это, вам (по крайней мере, в моем случае) не нужна какая-либо другая дополнительная операция, такая как sh или ./ пока вы звоните в скрипт.

Благодаря комментарию @Nathan Lilienthal

Комментарии (0)

Используйте бабки.

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

Затем извлеките выходные данные скрипта производителя в качестве аргумента в потребительском скрипте.

Комментарии (0)

Есть некоторые проблемы с импортом функций из другого файла. Во-первых : Вам не нужно делать этот файл исполняемым. Лучше не делать этого! просто добавь

. file

импортировать все функции. И все они будут такими, как если бы они были определены в вашем файле. Второй : Вы можете определить функцию с тем же именем. Это будет перезаписано. Плохо. Вы можете заявить об этом

declare -f new_function_name=old_function_name 

и только после этого импортируйте. Таким образом, вы можете вызвать старую функцию под новым именем. Третий : Вы можете импортировать только полный список функций, определенных в файле. Если некоторые не нужны, вы можете отменить их. Но если вы переписаете свои функции после отмены, они будут потеряны. Но если вы установите ссылку на нее, как описано выше, вы можете восстановить после сброса с тем же именем. Наконец В общей процедуре импорта опасно и не так просто. Быть осторожен! Вы можете написать сценарий, чтобы сделать это проще и безопаснее. Если вы используете только часть функций (не все), лучше разделите их на разные файлы. К сожалению, эта техника не очень хорошо зарекомендовала себя в bash. Например, в Python и некоторых других языках сценариев это легко и безопасно. Можно сделать частичный импорт только необходимых функций со своими именами. Мы все хотим, чтобы в следующих версиях bush была сделана та же функциональность. Но теперь мы должны написать много дополнительной трески, чтобы делать то, что вы хотите.

Комментарии (1)

Если у вас есть другой файл в том же каталоге, вы можете сделать:

bash another_script.sh

или

source another_script.sh

или


 another_script.sh.```

Когда вы используете `bash` вместо `source`, скрипт не может изменить среду родительского скрипта. `.Команда `является стандартом POSIX, а команда `source` - более читаемым синонимом bash для `.`(Я предпочитаю« источник »над`.`). Если ваш скрипт находится в другом месте, просто укажите путь к этому сценарию. И относительный, и полный путь должен иметь мир.
Комментарии (0)