Как вызвать один shell-скрипт из другого shell-скрипта?
У меня есть два скрипта на оболочке: a.sh
и b.sh
.
Как я могу вызвать b.sh
из скрипта a.sh
?
5 ответ(ов)
Существует несколько способов сделать это:
Сделайте другой скрипт исполняемым, выполнив команду
chmod a+x /path/to/file
, добавьте строку#!/bin/bash
(называемую шебанг) в начале файла и добавьте путь к файлу в переменную окружения$PATH
. После этого вы сможете вызывать его как обычную команду;Или вызовите его с помощью команды
source
(это алиас для.
), вот так:source /path/to/script
Или используйте команду
bash
для выполнения скрипта, например:/bin/bash /path/to/script
Первый и третий подходы выполняют скрипт как отдельный процесс, поэтому переменные и функции в другом скрипте будут недоступны.
Второй подход выполняет скрипт в процессе первого скрипта, и таким образом подтягивает переменные и функции из другого скрипта (они будут доступны из вызывающего скрипта). При этом будут выполнены все команды другого скрипта, не только присвоены переменные.
Стоит отметить, что если вы используете exit
во втором скрипте, это приведет к выходу и из первого скрипта. Такого не произойдет в первом и третьем методах.
Конечно! Вот перевод вашего текста на русский язык в стиле ответа на StackOverflow.com:
Проверте это.
#!/bin/bash
echo "Этот скрипт собирается запустить другой скрипт."
sh ./script.sh
echo "Этот скрипт только что запустил другой скрипт."
Этот скрипт сначала выводит сообщение о том, что он собирается запустить другой скрипт, а затем выполняет script.sh
. После завершения выполнения второго скрипта, он выводит сообщение о том, что запуск завершён. Не забудьте, что script.sh
должен находиться в той же директории, что и этот скрипт, или вам нужно будет указать полный путь к нему.
Есть несколько способов выполнить ваш скрипт в терминале. Вот несколько примеров:
#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"
# Здесь вы выполняете ваш скрипт
"$SCRIPT_PATH"
# или
. "$SCRIPT_PATH"
# или
source "$SCRIPT_PATH"
# или
bash "$SCRIPT_PATH"
# или
eval '"$SCRIPT_PATH"'
# или
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT
# или
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT
# или
("$SCRIPT_PATH")
# или
(exec "$SCRIPT_PATH")
Все эти способы корректны для пути с пробелами!!!
Ответ, который я искал:
( exec "путь/к/скрипту" )
Как упоминалось, exec
заменяет оболочку, не создавая нового процесса. Тем не менее, мы можем поместить это в подсистему, что обеспечивается с помощью круглых скобок.
EDIT:
На самом деле ( "путь/к/скрипту" )
тоже будет достаточно.
Если у вас есть другой файл в той же директории, вы можете выполнить его с помощью одной из следующих команд:
bash another_script.sh
или
source another_script.sh
или
. another_script.sh
Когда вы используете команду bash
, вместо source
, скрипт не сможет изменить окружение родительского скрипта. Команда .
является стандартом POSIX, в то время как команда source
является более читаемой синонимом для .
в bash (я предпочитаю использовать source
вместо .
). Если ваш скрипт находится в другом месте, просто укажите путь к этому скрипту. Как относительные, так и полные пути должны сработать.
Как выводить команды оболочки по мере их выполнения
Назначение значений по умолчанию для переменных оболочки одной командой в bash
Как указать приватный SSH-ключ для выполнения команды shell в Git?
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как использовать 'grep' для непрерывного потока?