Estou definindo um script de shell que um usuário deve source
executar em vez de.
Existe uma maneira convencional ou inteligente de sugerir ao usuário que esse é o caso, por exemplo, através de uma extensão de arquivo?
Existe código shell que eu possa escrever no próprio arquivo, o que fará com que ele ecoe uma mensagem e saia se for executado em vez de originado, para que eu possa ajudar o usuário a evitar esse erro óbvio?
x
, que contém apenas o comando. your-script-to-be-sourced
, tudo bem, mas se ele quiser executá-bash your-script-to-be-sourced
lo, deve ser proibido? Qual é o objetivo dessa restrição?env
variáveis e as deixa como saída de script de fato . Um novato ficará preso por dias com o quebra-cabeça se você permitir que ele execute.if __name__ == '__main__'
?Respostas:
Supondo que você esteja executando o bash, coloque o código a seguir no início do script que você deseja obter, mas não executar:
Em bash,
${BASH_SOURCE[0]}
conterá o nome do arquivo atual que o shell está lendo, independentemente de estar sendo originado ou executado.Por outro lado,
$0
é o nome do arquivo atual que está sendo executado.-ef
testa se esses dois arquivos são o mesmo arquivo. Se estiverem, alertamos o usuário e saímos.Nem
-ef
nemBASH_SOURCE
são POSIX. Embora-ef
seja suportado por ksh, yash, zsh e Dash,BASH_SOURCE
requer bash. Emzsh
, no entanto,${BASH_SOURCE[0]}
poderia ser substituído por${(%):-%N}
.fonte
echo "Usage: source \"$myfile\""
source
não é portátil. Considerando que esta resposta é específico do bash, não é tão ruim, mas é um bom hábito de usar o portátil.
Um arquivo não executável pode ser originado, mas não executado, portanto, como primeira linha de defesa, não definir o sinalizador executável deve ser uma boa dica ...
Edit: trick Eu apenas tropecei: faça o shebang ser qualquer executável que não seja um interpretador de shell,
/bin/false
faça com que o script retorne um erro (rc! = 0)fonte
bash somefile.sh
...bash
(vd perl, python, awk ...), então você olhou t a fonte e visto o comentário que diz para não fazê-lo :)somefile.pl
e Python comosomefile.py
, de modo nenhum, eu provavelmente não leu os comentários (que são aqueles, mesmo, de qualquer maneira?) Ebash somefile.sh
é mais curto para escrever do quechmod +x somefile.sh; ./somefile.sh
...bash
, primeiro tentarãoexecve
um arquivo, mas se isso falhar, eles inspecionam o arquivo manualmente e manualmente interpretam o arquivo e o#!
invocam por esse intérprete: esse é um legado dos dias em que#!
era um espaço puramente para o usuário convenção, em vez de ser tratado pelo próprio kernel. Eu acho quebash
, pelo menos, não fará isso com arquivos não executáveis, mas não sei se é portátil esperar um comportamento tão sensato de todos os shells que o usuário possa estar chamando o script.bash
quebash script.sh
podem ser perigosos.Existem vários métodos sugeridos neste post do Stack Overflow , dos quais gostei do baseado em função sugerido por Wirawan Purwanto e mr.spuratic :
Então você pode adicionar ao início do script:
fonte
Supondo que seja apenas inútil, e não prejudicial, executar o script, você pode adicionar
até o final do script.
return
fora de uma função possui um código de saída diferente de zero, a menos que o arquivo esteja sendo originado.fonte
return 2>/dev/null; echo "$0: This script must be sourced" 1>&2; exit 1
Quando você cria um script de shell, a linha shebang é ignorada. Ao inserir um shebang inválido, você pode alertar o usuário que o script foi executado erroneamente:
A mensagem de erro será esta:
O nome do argumento (arbitrário) já fornece uma dica forte, mas a mensagem de erro ainda não está 100% clara. Podemos corrigir isso com um script de utilitário
source-this-script
que é colocado em algum lugar no seuPATH
:Agora, a mensagem de erro será esta:
Comparação com outras abordagens
Comparado às outras respostas, essa abordagem requer apenas alterações mínimas em cada script (e ter uma linha shebang ajuda na detecção do tipo de arquivo nos editores e especifica o dialeto do shell script, para que haja benefícios). A desvantagem é uma mensagem de erro pouco clara ou a adição (única) de outro script de shell.
No entanto, não impede a chamada explícita
bash path/to/script.sh
(obrigado @muru!).fonte
bash some/script.sh
, o que também ignoraria o shebang.#!/bin/echo 'You must source this script!'
ou algo assim.