Ou o que estou perguntando aqui é extremamente pouco ortodoxo / não convencional / arriscado, ou minhas habilidades no Google-fu simplesmente não estão à altura do problema ...
Em um bash
script de shell, há alguma maneira fácil de saber se ele está sendo originado por outro script de shell ou está sendo executado por si só? Em outras palavras, é possível diferenciar entre os dois comportamentos a seguir?
# from another shell script
source myScript.sh
# from command prompt, or another shell script
./myScript.sh
O que estou pensando em fazer é criar um shell script semelhante a utilitários, contendo bash
funções que podem ser disponibilizadas quando originadas. Quando este script estiver sendo executado por si só, eu gostaria que ele executasse certas operações, com base nas funções definidas também. Existe algum tipo de variável de ambiente que este script shell pode captar, por exemplo
some_function() {
# ...
}
if [ -z "$IS_SOURCED" ]; then
some_function;
fi
De preferência, estou procurando uma solução que não exija que o script do chamador defina quaisquer variáveis de sinalizador.
edit : Eu sei a diferença entre procurar e executar o script, o que estou tentando descobrir aqui se é possível dizer a diferença no script que está sendo usado (nos dois sentidos).
fonte
.
comando, mas sobre como detectar se um script foi originado ou executado normalmente (ou seja, em uma sub-camada).Respostas:
Sim - a variável $ 0 fornece o nome do script conforme foi executado:
Que funciona como:
Isso não serve para ser fonte de um shell interativo, mas você entendeu (espero).
Atualizado para incluir BASH_SOURCE - obrigado hjk
fonte
Combinar a resposta do @ DarkHeart com a variável de ambiente
BASH_SOURCE
parece fazer o truque:edit Parece ainda ser uma solução mais simples se eu apenas contar o número de elementos no
BASH_SOURCE
array:fonte
Acabei de criar o mesmo tipo de script de biblioteca que funciona muito como o BusyBox. Nele, uso a seguinte função para testar se está sendo originada ...
A matriz FUNCNAME mantida pelo Bash é essencialmente uma pilha de chamadas de função.
$FUNCNAME
(ou${FUNCNAME[0]}
) é o nome da função atualmente em execução.${FUNCNAME[1]}
é o nome da função que a chamou e assim por diante.O item superior é um valor especial para o próprio script. Ele conterá ...
A função acima, na verdade, só funciona quando chamada no nível do script (que é tudo o que eu precisava). Ele falharia se chamado de dentro de outra função porque o número do item da matriz estaria errado. Para fazê-lo funcionar em qualquer lugar, é preciso encontrar o topo da pilha e testar esse valor, o que é mais complicado.
Se você precisar, pode obter o número do item da matriz do "topo da pilha" com ...
${#FUNCNAME[@]}
é o número de itens na matriz. Como uma matriz baseada em zero, subtraímos 1 para obter o último item #.Essas três funções são usadas juntas para produzir um rastreamento de pilha de funções semelhante ao Python e podem fornecer uma idéia melhor de como tudo isso funciona ...
Observe que FUNCNAME, BASH_SOURCE e BASH_LINENO são 3 matrizes mantidas pelo bash como se fossem uma matriz tridimensional.
fonte
Só quero acrescentar que contar a matriz parece não confiável e provavelmente não se deve assumir que
source
foi usado, pois o uso de um ponto (.
) também é muito comum (e antecede asource
palavra - chave).Por exemplo, para um
sourced.sh
script que contém apenasecho $0
:As soluções de comparação sugeridas funcionam melhor.
fonte
Uma maneira que também funciona ao obter a partir de um shell interativo :
A
BASH_LINENO
variável também é uma matriz com todas as linhas em que a função de chamada foi executada. Será zero se você chamar o script diretamente ou um número inteiro correspondente a um número de linha.A variável BASH_ * docs
fonte