Как включить файл в сценарий оболочки bash

122

Есть ли способ включить другой сценарий оболочки в сценарий оболочки, чтобы иметь доступ к его функциям?

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

Mechaflash
источник
возможный дубликат Bash: как лучше всего включить другие скрипты?
Трубадур
@Troubadour спасибо за ссылку. Несмотря на то, что сообщение относится к sourceкоманде, вопрос сам по себе заключается в том, как определить местоположение sourceфайла.
Mechaflash
1
«Основные вопросы» - это катализатор переполнения стека. Вы понимаете, что этот сайт индексируется, как и любой другой сайт, и теперь «как включить файл в сценарий оболочки bash» будет отображаться в Google, связанном с переполнением стека, что увеличивает посещаемость и доступность сайта. = D
Mechaflash
3
Вы умны! Спасибо за вашу крутизну!
Mechaflash 01
4
@Troubadour, глупо комментировать, что пользователь должен был найти ответ в Google, когда я попал на страницу именно так. Например, сегодня этот конкретный вопрос был лучшим результатом Google по запросу "включаемый файл bash". Должен ли я пропустить этот ответ, чтобы найти другое решение?
lwitzel

Ответы:

193

Просто поместите в свой сценарий:

source FILE

Или

. FILE # POSIX compliant

$ LANG=C help source
source: source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
Жиль Кено
источник
17
Обратите внимание, что . совместим с POSIX, а исходный код - нет
Mathieu_Du
Но здесь источник - это не совсем то же самое, что и в Cязыке. Здесь источник выполняет дочерний сценарий в основном сценарии. Что, если я просто хочу вызвать определенную функцию из дочернего скрипта?
Пареш Майани
8
Не путайте . script.shс ./script.sh. Я потерял часы, пытаясь понять, что происходит
Тихомир Митков
Пока . совместим с POSIX, что означает, что он будет работать с sh, dash, zsh и другими оболочками POSIX. Лучше использовать. поскольку у некоторых оболочек есть собственная похожая, но немного другая версия «исходного кода», которая может нарушить работу вашего приложения.
Джейкоб Корба,
52

Вышеуказанные ответы верны, но если запустить сценарий в другой папке, возникнут проблемы.

Например, a.shи b.shнаходятся в одной папке, a include b с . ./b.shto include.

При запуске сценария из папки, например , с xx/xx/xx/a.sh, файл b.shне найден: ./b.sh: No such file or directory.

я использую

. $(dirname "$0")/b.sh
Fancyoung
источник
33

Да, используйте исходный текст или короткую форму, которая просто .:

. other_script.sh
Павел
источник
3
Обратите внимание, что .версия работает shтак же, как и Bash. «Исходный» работает только в Баше.
Шридхар Сарнобат
2

В моей ситуации, чтобы включить color.shиз того же каталога в init.sh, мне пришлось сделать следующее.

. ./color.sh

Не уверен, почему, ./а не color.shнапрямую. Содержание color.shследующее.

RED=`tput setaf 1`
GREEN=`tput setaf 2`
BLUE=`tput setaf 4`
BOLD=`tput bold`
RESET=`tput sgr0`

Использование File color.shне приводит к ошибке, но цвет не отображается. Я тестировал это, Ubuntu 18.04и Bashверсия:

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

Raf
источник
Это просто даст вам файл в вашем текущем рабочем каталоге, а не в каталоге, в котором он init.shнаходится (они совпадают, если вы запускали его ./init.shв первую очередь).
ricab