Jak dołączyć plik do skryptu powłoki bash

122

Czy istnieje sposób na włączenie innego skryptu powłoki do skryptu powłoki, aby mieć dostęp do jego funkcji?

Podobnie jak w PHP, możesz użyć includedyrektywy z innymi plikami PHP, aby uruchomić zawarte w nich funkcje, po prostu wywołując nazwę funkcji.

Mechaflash
źródło
@Troubadour dzięki za odniesienie. Mimo że post odnosi się do sourcepolecenia, pytanie samo w sobie polega na pytaniu, jak wskazać lokalizację sourcepliku.
Mechaflash
1
„Podstawowe pytania” są katalizatorem przepełnienia stosu. Rozumiesz, że ta witryna jest indeksowana jak każda inna witryna, a teraz „jak dołączyć plik do skryptu powłoki bash” pojawi się na linkach Google do przepełnienia stosu, zwiększając ruch w witrynie i widoczność. = D
Mechaflash
3
Jesteś mądry! Dzięki za wspaniałość!
Mechaflash
4
@Troubadour, głupio jest komentować, że użytkownik powinien był znaleźć w Google odpowiedź, kiedy dokładnie tak dotarłem do strony. Na przykład dzisiaj to konkretne pytanie było najlepszym wynikiem Google dla „pliku dołączanego bash”. Czy powinienem pominąć tę odpowiedź, aby znaleźć inne rozwiązanie?
lwitzel

Odpowiedzi:

193

Po prostu umieść w swoim skrypcie:

source FILE

Lub

. 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.
Gilles Quenot
źródło
17
Zwróć na to uwagę. jest zgodny z POSIX, podczas gdy źródło nie jest
Mathieu_Du
Ale tutaj źródło nie jest dokładnie tym samym, co w Cjęzyku. Tutaj źródło wykonuje skrypt potomny w skrypcie głównym. A co jeśli chcę tylko wywołać określoną funkcję ze skryptu potomnego?
Paresh Mayani
8
Nie myl . script.shz ./script.sh. Straciłem godziny, próbując dowiedzieć się, co się dzieje
Tihomir Mitkov
Podczas . jest zgodny z POSIX, co oznacza, że ​​będzie działał na powłokach sh, dash, zsh i innych powłokach POSIX. Lepiej go używać. ponieważ niektóre powłoki mają swoją własną, podobną, ale nieco inną wersję „źródła”, która może uszkodzić Twoją aplikację.
Jacob Korba
52

Powyższe odpowiedzi są poprawne, ale jeśli uruchomisz skrypt w innym folderze, wystąpi problem.

Na przykład, a.shi b.shsą w tym samym folderze, a include b with . ./b.shto include.

Po uruchomieniu skryptu z folderu, na przykład xx/xx/xx/a.sh, plik b.shnie znaleziono: ./b.sh: No such file or directory.

używam

. $(dirname "$0")/b.sh
Fancyoung
źródło
33

Tak, użyj źródła lub krótkiej formy, która jest po prostu .:

. other_script.sh
Paweł
źródło
3
Zauważ, że ta .wersja działa shrównie dobrze jak Bash. „Źródłowy” działa tylko w Bash.
Sridhar Sarnobat
2

W mojej sytuacji, aby dołączyć color.shz tego samego katalogu init.sh, musiałem zrobić coś w następujący sposób.

. ./color.sh

Nie wiem, dlaczego ./i nie color.shbezpośrednio. Treść color.shjest następująca.

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

Korzystanie z File color.shnie powoduje błędu, ale kolor nie jest wyświetlany. Przetestowałem to w programie, Ubuntu 18.04a Bashwersja to:

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

Raf
źródło
To po prostu da ci plik w twoim bieżącym katalogu roboczym, a nie w katalogu, w którym się init.shznajduje (pokrywają się, jeśli uruchomiłeś go ./init.shw pierwszej kolejności).
ricab