Há um executável /usr/bin/foo
que eu e outros scripts usamos, mas que se comporta um pouco mal, então criei um wrapper Bash com o mesmo nome de arquivo no /usr/local/bin/foo
qual corrigi seu comportamento inadequado. Meu PATH
é /usr/local/bin:/usr/bin
. No script wrapper, eu tenho que executar o executável original por caminho absoluto para não entrar em um loop infinito:
$ cat /usr/local/bin/foo
#/bin/zsh
/usr/bin/foo | grep -v "^INFO" # stfu, really
Existe alguma maneira simples (talvez específica Zsh ou Bash) para executar próximo foo
em PATH
, que é o foo
que está em PATH
diretórios que são depois o diretório do qual atual foo
foi executado, para que eu não teria que usar o caminho absoluto para o executável original?
Eu poderia fazer uma função para isso /etc/zshenv
e não é um problema. Só estou me perguntando se existe algo padrão. Não quero usar alias ou corrigir o executável original.
EDIT 1:
$ cat /usr/local/bin/foo
#/bin/zsh
path=(${path/#%$0:A:h}) foo | grep -v "^INFO" # stfu, really
Isso deve esvaziar (mas manter) todas as seqüências de caracteres em PATH ( ${path/...}
) que correspondem totalmente ( #%
) ao :A
diretório absoluto ( ) ( :h
) do executável atual ( $0
). TBH, eu o montei no StackExchange e não o entendo completamente. Espero que não me morda.
EDIT 2:
$ cat /usr/local/bin/foo
#/bin/zsh
path[${path[(i)$0:A:h]}]=() foo | grep -v "^INFO" # stfu, really
$path[(i)foo]
localiza o índice de foo
na matriz path
ou mais 1 comprimento da matriz.
Respostas:
Você pode descobrir em qual diretório o script está (
$0:h
em zsh,"${0%/*}"
em sh) e remover esse diretório dePATH
(path=(${path:#$0:h})
em zsh, mais complicado em sh . Isso pode falhar sePATH
contiver o mesmo diretório duas vezes, por exemplo, através de um link simbólico.Uma desvantagem da abordagem direta é que isso remove o diretório do caminho, mas outros programas no mesmo diretório podem ser desejáveis. Você pode resolver esse problema executando apenas a pesquisa de caminho com um caminho modificado.
Em vez disso, eu faria a
PATH
pesquisa manualmente e pularia qualquer ocorrência do script em execução.fonte
Exemplo:
Para mim,
type -a egrep
imprime um alias definido pelo usuário e oegrep
comando real , adicionando outroegrep
no meu $ HOME / bin / também mostra ... Na ordem; primeiro, depois os itens restantes na mesma ordem que PATH os possui.fonte