Como incluir um arquivo em um script bash shell

121

Existe uma maneira de incluir outro script de shell em um script de shell para poder acessar suas funções?

Assim como no PHP, você pode usar a includediretiva com outros arquivos PHP para executar as funções contidas nele, simplesmente chamando o nome da função.

Mechaflash
fonte
@Troubadour obrigado pela referência. Mesmo que a postagem se refira ao sourcecomando, a questão em si é como identificar a localização de um sourcearquivo.
Mechaflash
1
"questões básicas" são o catalisador do estouro da pilha. Você entende que este site é indexado como qualquer outro site, e agora "como incluir arquivo em um script de shell bash" aparecerá no Google com links para estouro de pilha, aumentando assim o tráfego e a exposição do site. = D
Mechaflash
3
Você é esperto! Obrigado pela sua grandiosidade!
Mechaflash 01 de
4
@Troubadour, é bobagem comentar que o usuário deveria ter procurado a resposta no Google, quando foi exatamente assim que cheguei à página. Por exemplo, hoje esta questão específica foi o principal resultado do Google para "arquivo de inclusão de bash". Devo ter pulado esta resposta para encontrar alguma outra solução?
lwitzel

Respostas:

192

Simplesmente coloque dentro do seu script:

source FILE

Ou

. 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
fonte
17
Observe que . é compatível com POSIX, enquanto a fonte não
Mathieu_Du
Mas aqui a fonte não é exatamente a mesma que fazemos na Clinguagem. Aqui, a fonte está executando o script filho no script principal. E se eu quiser apenas chamar uma função específica do script filho?
Paresh Mayani
8
Não confunda . script.shcom ./script.sh. Perdi horas tentando descobrir o que está acontecendo
Tihomir Mitkov
Enquanto . é compatível com POSIX, o que significa que funcionará no sh, dash, zsh e outros shells POSIX. É melhor usar. como alguns shells têm sua própria versão de "fonte" semelhante, mas um pouco diferente, que pode quebrar seu aplicativo.
Jacob Korba
51

As respostas acima estão corretas, mas se executar o script em outra pasta, haverá algum problema.

Por exemplo, o a.sh e b.shestão na mesma pasta, a inclui b com . ./b.sh a incluir.

Ao executar o script fora da pasta, por exemplo com xx/xx/xx/a.sh , o arquivo b.shnão será encontrado:./b.sh: No such file or directory .

eu uso

. $(dirname "$0")/b.sh
Fancyoung
fonte
33

Sim, use a fonte ou a forma abreviada que é apenas .:

. other_script.sh
Paulo
fonte
3
Observe que a .versão funciona shtão bem quanto o Bash. A "fonte" só funciona no Bash.
Sridhar Sarnobat
2

Na minha situação, para incluir color.shdo mesmo diretório em init.sh, tive que fazer algo da seguinte maneira.

. ./color.sh

Não sei por que o ./e não color.shdiretamente. O conteúdo de color.shé o seguinte.

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

Utilizar File color.shnão dá erro, mas a cor não é exibida. Eu testei isso em Ubuntu 18.04e a Bashversão é:

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

Raf
fonte
Isso fornecerá apenas o arquivo em seu diretório de trabalho atual, não o diretório onde init.shestá (eles coincidem se você o lançou ./init.shem primeiro lugar).
ricab