É possível que um script de shell de origem saiba sua localização? Eu li determinar caminho para o script shell originado mas as respostas focar bash
e tcsh
e falhar se um shell POSIX é usado. $0
também não é a solução e produz resultados errados .
Uma solução não precisa ser 100% confiável. É improvável que o caminho contenha links físicos ou simbólicos.
# sourcing the script should yield the absolute path to the script
. somedir/thescript
# within “thescript”
-> /tmp/foo/bar/somedir
Alguns antecedentes: O script faz parte de um aplicativo existente que contém dezenas de binários em um bin
diretório em um local conhecido (varia de acordo com a arquitetura) em relação ao script de origem. Para usar o aplicativo, o usuário fornece o script que anexa o bin
diretório ao diretório PATH
, para que os binários do aplicativo possam ser facilmente chamados no shell atual (qualquer que seja o shell).
. /path/to/script
comoMARCO_DIR=/path/to; . $MARCO_DIR/script
oueval "$(/path/to/script)"
? @RahulPatilBASH_SOURCE
é obviamente específico para o bash.Respostas:
O local do script de origem não está disponível, a menos que você esteja usando um shell que ofereça extensões para a especificação POSIX. Você pode testar isso com o seguinte snippet:
onde
included.sh
contémNo bash, o nome do script de origem está
$BASH_SOURCE
. No zsh (no modo de compatibilidade zsh, não no modo de compatibilidade sh ou ksh), ele está$0
(observe que em uma função,$0
é o nome da função). No pdksh and dash, ele não está disponível. No ksh93, esse método não revela a solução, mas o caminho completo para o script incluído está disponível como${.sh.file}
.Se exigir bash ou ksh93 ou zsh for bom o suficiente, você pode usar este trecho:
Você pode tentar adivinhar a localização do script, observando quais arquivos o shell abriu. Experimentalmente, isso parece funcionar com o dash e o pdksh, mas não com o bash ou o ksh93, que pelo menos para um script curto, fechou o arquivo de script no momento em que o executava.
O script pode não ser o arquivo com o descritor de número mais alto se o script for originado em um script complexo que esteja sendo reproduzido com redirecionamentos. Você pode querer percorrer os arquivos abertos. Não é garantido que funcione de qualquer maneira. A única maneira confiável de localizar um script de origem é usar o bash, ksh93 ou zsh.
Se você puder alterar a interface, em vez de procurar seu script, faça com que ele imprima um snippet de shell a ser passado
eval
no chamador. É o que os scripts para definir variáveis de ambiente geralmente fazem. Ele permite que seu script seja escrito independentemente dos caprichos do shell e da configuração do chamador.No chamador:
eval "`/path/to/setenv`"
fonte
Adicionando à resposta do Gilles, você PODE ser capaz de obter o shell script (
if $0 = ash
) através do/proc/$$ interface
. Eu não sei o quão preciso isso é, mas/proc/$$/fd/11
parece sempre apontar para this_script com as cinzas do BusyBox.Fornecer isso como uma resposta potencial para aqueles que se deparam com esta página (como eu).
A última resposta foi excluída - portanto, minha reivindicação para este trabalho é testada em 4 plataformas HW diferentes (x86, ARM, XLP e powerpc). Todos dão a mesma resposta de fd / 11. Um readlink de
/proc/$$/fd/11
produz meu script.Andy
fonte