Por que os binários Go (lang) não são exibidos em 'which', 'whereis' e ferramentas similares?

0

Eu instalei alguns utilitários Go por go get -u github.com/[owner]/[repo] e não entendo por que eles não honram convenções de shell padrão. O utilitário que eu instalei não tinha nenhum traço de nada no diretório do qual o comando foi executado, nem qualquer saída que indicasse nada, então procurei-o por um meio bastante padronizado e não consegui encontrá-lo, mas sempre consegui executá-lo. :

~ $ which hey
~ $ hey
Usage: hey [options...] <url>

Options:
  -n  Number of requests to run. Default is 200.
  -c  Number of requests to run concurrently. Total number of requests cannot be smaller than the concurrency level. Default is 50.
[…]

Eu só percebi porque notei que o final do meu $PATH inclui :~/go/bin e, com certeza, os três utilitários que eu instalei estão presentes lá. Salvou-me de uma longa pesquisa find .

Como os binários instalados do Go escapam dos meios de pesquisa de arquivos padrão, mas ainda podem ser executados?

Isto está ocorrendo em um bash shell padrão, como é fornecido com o macOS High Sierra (10.13.6).

~ $ type -a hey
hey is /Users/jsalaz/go/bin/hey
~ $ type -a which
which is /usr/bin/which
    
por VxJasonxV 13.07.2018 / 10:57

1 resposta

2

Até onde eu sei, usar ~/go/bin como um componente $ PATH depende de uma extensão fora do padrão (talvez GNU?).

  • Sempre que seu shell (bash) pesquisar por binários, ele expandirá o prefixo ~/ para o caminho do diretório inicial. Você pode ver que type (que é construído no shell) encontra o programa Go muito bem.

  • Enquanto isso, o comando /usr/bin/which (que é fornecido pelo macOS e não faz parte do shell) não executa essa expansão, porque isso não foi especificado em The Open Group descrição oficial de como $ PATH deve funcionar .

Em outras palavras, o prefixo ~/ faz parte da linguagem do shell, mas não faz parte da sintaxe geral do caminho do sistema operacional. Em todos os outros lugares, incluindo $ PATH (que não se limita a shells!), Significa simplesmente um diretório chamado ~ .

Ao definir $ PATH, você precisa garantir que os caminhos sejam expandidos no momento da atribuição:

PATH=$PATH:~/go/bin
PATH=$PATH:$HOME/go/bin
PATH="$PATH:$HOME/go/bin"

Este não funcionará:

PATH="$PATH:~/go/bin"
    
por 13.07.2018 / 11:19

Tags