Estou escrevendo um script wrapper para envolver a execução de outro comando; neste caso, o kitchen
comando Chef. Meu script também será chamado kitchen
e colocado mais cedo $PATH
para que a execução kitchen
do bash execute meu script wrapper.
A questão é: como eu chamo a versão original do kitchen
? A maneira óbvia, é claro, é apenas fornecer o caminho completo - basta colocar /usr/bin/kitchen
o script, mas outra pessoa pode instalá-lo em um caminho diferente. E é claro que isso exclui qualquer outro script wrapper — seria bom se a solução fosse empilhável.
Duas abordagens vêm à mente, ambas variantes sobre o mesmo tema:
- No script, passe por
$PATH
. Compare cada entrada$(dirname "$0")
usandostat
o número do dispositivo e o número do inode para ver se é o mesmo diretório. Em caso afirmativo, remova-o de$PATH
. Então pode apenas chamarkitchen
, porque não deve chamar novamente o script wrapper. - Semelhante ao nº 1, mas faça a
$PATH
pesquisa manualmente no script e usestat
em cada resultado vs.$0
. Continue pulando até nos encontrarmos, então use o próximo encontrado. Se nunca nos encontrarmos, basta executá-lo normalmente (para lidar com o caso em que o wrapper não está,$PATH
mas foi executado fornecendo um caminho para ele)
Existe uma maneira melhor? Ou o código para fazer isso já existe em algum lugar em um sistema típico Debian ou Ubuntu Linux?
Já fiz algo parecido algumas vezes no passado e o que vou fazer é apenas usar
command kitchen
no script, nomeá-lo com outro nomemy-kitchen
e depois criar um alias:alias kitchen=/path/to/my-kitchen
Não tenho certeza se isso funciona para o seu caso de uso.
Você pode escapar de um alias com uma barra invertida para evitar que ele seja expandido pelo shell.
command
também funciona.Eu não tenho
kitchen
na minha área de trabalho, então vou demonstrar usando o aliaspwd
parauname -r
:Parece que você deseja executar o próximo
kitchen
em$PATH
.