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.