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.



@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.

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

33

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

. other_script.sh

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)


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.