Perché i binari Do not Go (lang) vengono visualizzati in `which`,` whereis` e strumenti simili?


0

Ho installato un paio di utility Go tramite go get -u github.com/[owner]/[repo] e non capisco perché non rispettino le convenzioni standard sulla shell. L'utility che ho installato non ha traccia di nulla nella directory da cui è stato eseguito il comando, né alcun output che indichi qualcosa, quindi l'ho cercato tramite un mezzo abbastanza standard, e non sono riuscito a trovarlo, eppure sono sempre stato in grado di eseguirlo :

~ $ 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.
[…]

L'ho capito solo perché ho notato che la coda della mia $PATH include :~/go/bine sono sicuro che i tre programmi di utilità che ho installato sono presenti. Mi ha salvato da un lungo ventoso find ricerca.

In che modo i file binari installati escono dalla ricerca di file standard e rimangono comunque in grado di funzionare?

Questo si verifica su una shell bash standard, come fornita con macOS High Sierra (10.13.6).

~ $ type -a hey
hey is /Users/jsalaz/go/bin/hey
~ $ type -a which
which is /usr/bin/which

Supponendo che sia bash, puoi mostrare l'output di type -a hey e persino type -a which?
grawity

Io davvero non uso type abbastanza, penso di poter contare il numero di volte da una parte. Tendo a fare un'ispezione diretta con ls flag per determinarne gli attributi. Sicuramente conserverà type -a via per un uso futuro ...
VxJasonxV

Attributi? Questo è ... non esattamente cosa type è per.
grawity

Risposte:


2

Per quanto ho capito, usando ~/go/bin come componente $ PATH si basa su un'estensione non standard (forse GNU?).

  • Ogni volta che la shell (bash) cerca i file binari, espande il file ~/ prefisso al percorso della directory home. Potete vederlo type (che è incorporato nella shell) trova il programma Go bene.

  • Nel frattempo, il /usr/bin/which comando (fornito da macOS e non fa parte della shell) non eseguire questa espansione, perché non è stata specificata alcuna cosa in The Open Group descrizione ufficiale di come $ PATH dovrebbe funzionare .

In altre parole, il ~/ il prefisso fa parte del linguaggio della shell, ma non parte della sintassi generale del percorso del sistema operativo. In tutti gli altri posti, incluso $ PATH (che non è limitato alle shell!), Significa semplicemente una directory chiamata ~.

Quando imposti $ PATH, devi assicurarti che i percorsi siano espansi al momento dell'assegnazione:

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

Questo non funzionerà:

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

È incredibile. E vero, in passato ho sempre usato $HOME nel $PATH e qualsiasi altra variabile di ambiente shell. Questo è senza dubbio un altro coreutils BSD (che macOS spedisce) rispetto alla discrepanza di coreutils GNU. Ho bisogno di testarlo anche su una macchina Linux.
VxJasonxV
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.