Як включити файл у скрипт bash shell


121

Чи є спосіб включити інший скрипт оболонки до сценарію оболонки, щоб мати доступ до своїх функцій?

Як, наприклад, у PHP ви можете використовувати includeдирективу з іншими файлами PHP, щоб запустити функції, що містяться в простому, просто зателефонувавши до імені функції.



@Troubadour дякую за довідку. Незважаючи на те, що пост посилається на sourceкоманду, саме по собі питання полягає в тому, як точно визначити розташування sourceфайлу.
Mechaflash

1
"основні питання" є каталізатором переповнення стека. Ви розумієте, що цей сайт індексується, як і будь-який інший сайт, і тепер "як включити файл у скрипт bash shell" з'явиться в Google, що посилається на переповнення стека, тим самим збільшуючи трафік і експозицію сайту. = D
Mechaflash

3
Ти розумний! Дякую вашій приголомшливості!
Мечафлаш

4
@Troubadour, нерозумно коментувати, що користувач повинен відповідати Google за відповідь, коли саме так я потрапив на сторінку. Наприклад, сьогодні саме це питання було головним результатом Google для "bash include file". Чи повинен я пропустити цю відповідь, щоб знайти якесь інше рішення?
lwitzel

Відповіді:


192

Просто помістіть всередині вашого сценарію:

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мові. Тут джерело виконує дочірній скрипт в основний сценарій. Що робити, якщо я просто хочу викликати певну функцію з дочірнього сценарію?
Paresh Mayani

8
Не плутати . script.shз ./script.sh. Я втратив години, намагаючись з’ясувати, що відбувається
Тихомир Мітков

Поки. сумісний з POSIX, а це означає, що він буде працювати на ш, dash, zsh та інших оболонках POSIX. Краще використовувати. оскільки у деяких оболонок є своя, схожа, але трохи інша версія "джерела", яка може зламати вашу програму.
Яків Корба

51

Наведені вище відповіді правильні, але якщо запустити скрипт в іншій папці, виникне певна проблема.

Наприклад, a.shі b.shзнаходяться в одній і тій же папці, включати b з, . ./b.shщоб включити.

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

я використовую

. $(dirname "$0")/b.sh


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)


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.