Come includere file in uno script di shell bash


121

C'è un modo per includere un altro script di shell in uno script di shell per poter accedere alle sue funzioni?

Come in PHP puoi usare la includedirettiva con altri file PHP per eseguire le funzioni che sono contenute semplicemente chiamando il nome della funzione.



@ Troubadour, grazie per il riferimento. Anche se il post si riferisce al sourcecomando, la domanda in sé è chiedere come individuare la posizione di un sourcefile.
Mechaflash

1
"domande di base" sono il catalizzatore dello stack overflow. Capisci che questo sito viene indicizzato come qualsiasi altro sito, e ora "come includere file in uno script di shell bash" verrà visualizzato su Google che si collega allo stack overflow aumentando così il traffico e l'esposizione del sito. = D
Mechaflash

3
Sei intelligente! Grazie della tua suggestione!
Mechaflash

4
@ Troubadour, è sciocco commentare che l'utente avrebbe dovuto cercare su Google la risposta, quando è esattamente come sono arrivato alla pagina. Ad esempio, oggi questa domanda specifica è stata il primo risultato di Google per "bash include file". Avrei dovuto saltare questa risposta per trovare qualche altra soluzione?
lwitzel

Risposte:


192

Metti semplicemente all'interno del tuo script:

source FILE

O

. 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
Nota che . è conforme a POSIX mentre la fonte non lo è
Mathieu_Du

Ma qui la fonte non è esattamente l'inclusione come facciamo nel Clinguaggio. Qui la fonte sta eseguendo lo script figlio nello script principale. E se volessi chiamare una particolare funzione dallo script figlio?
Paresh Mayani

8
Non confondere . script.shcon ./script.sh. Ho perso ore cercando di capire cosa sta succedendo
Tihomir Mitkov

Mentre . è conforme a POSIX, il che significa che funzionerà su sh, dash, zsh e altre shell POSIX. È meglio usare. poiché alcune shell hanno la loro versione di "sorgente", simile ma leggermente diversa, che potrebbe danneggiare la tua app.
Jacob Korba

51

Le risposte sopra sono corrette, ma se esegui lo script in un'altra cartella, ci sarà qualche problema.

Ad esempio, a.she si b.shtrovano nella stessa cartella, a include b con . ./b.sh per includere.

Quando esegui lo script fuori dalla cartella, ad esempio con xx/xx/xx/a.sh, il file b.shnon verrà trovato:./b.sh: No such file or directory .

Io uso

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

33

Sì, usa la fonte o la forma breve che è semplicemente .:

. other_script.sh

3
Nota che la .versione funziona shcosì come Bash. Quello "sorgente" funziona solo in Bash.
Sridhar Sarnobat

2

Nella mia situazione, per includere color.shdalla stessa directory in init.sh, ho dovuto fare qualcosa come segue.

. ./color.sh

Non sono sicuro del perché ./e non color.shdirettamente. Il contenuto di color.shè il seguente.

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

Facendo uso di File color.shnon errore ma, il colore non viene visualizzato. L'ho provato Ubuntu 18.04e la Bashversione è:

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


Questo ti darà solo il file nella tua directory di lavoro corrente, non la directory in cui si init.shtrova (coincidono se l'hai avviato con ./init.shin primo luogo).
ricab

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.