Warum werden die Binaries von Go (lang) nicht in "which", "whereis" und ähnlichen Tools angezeigt?

367
VxJasonxV

Ich habe ein paar Go-Hilfsprogramme über installiert go get -u github.com/[owner]/[repo]und ich verstehe nicht, warum sie die üblichen Shell-Konventionen nicht einhalten. Das Dienstprogramm, das ich installierte, hatte keine Spur von etwas in dem Verzeichnis, von dem aus der Befehl ausgeführt wurde, und auch keine Ausgabe, die etwas angibt. Daher habe ich es mit einem normalen Standard gesucht und konnte es nicht finden. Trotzdem konnte ich es immer ausführen :

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

Habe ich es nur, weil ich, dass das hintere Ende meiner bemerkt $PATHenthält :~/go/bin, und sicher genug, die drei gehen Dienstprogramme ich installiert habe, sind dort vorhanden. Hat mich vor einer langatmigen findSuche gerettet .

Wie können die von Go installierten Binärdateien Standard-Dateisuchfunktionen durchlaufen, aber trotzdem ausgeführt werden?

Dies geschieht auf einer Standard-Bash-Shell, wie sie mit macOS High Sierra (10.13.6) ausgeliefert wird.

~ $ type -a hey hey is /Users/jsalaz/go/bin/hey ~ $ type -a which which is /usr/bin/which 
0
Angenommen, es ist bash, können Sie die Ausgabe von "type -a hey" und sogar "type -a which" anzeigen? grawity vor 6 Jahren 0
Ich verwende 'type' wirklich nicht genug, ich denke, ich kann die Anzahl der Male an einer Hand zählen. Ich neige dazu, direkte Inspektionen mit `ls`-Flags durchzuführen, um die Attribute zu ermitteln. Bewahrt definitiv 'type -a' für die zukünftige Verwendung auf… VxJasonxV vor 6 Jahren 0
Attribute? Das ist ... nicht genau das, was "Typ" ist. grawity vor 6 Jahren 0

1 Antwort auf die Frage

2
grawity

Soweit ich es verstehe, ~/go/binbasiert die Verwendung einer $ PATH-Komponente auf einer nicht standardmäßigen Erweiterung (vielleicht GNU?).

  • Wenn Ihre Shell (bash) nach Binärdateien sucht, wird das ~/Präfix um den Pfad Ihres Home-Verzeichnisses erweitert. Man kann sehen, dass typedas Go-Programm (das in die Shell eingebaut ist) genau das findet.

  • Inzwischen ist der /usr/bin/whichBefehl (die von macOS vorgesehen ist, und ist nicht Teil der Schale) nicht führt diese Erweiterung, weil es so etwas in der offenen Gruppe angegeben wurde offizielle Beschreibung, wie $ PATH funktionieren soll .

Mit anderen Worten, das ~/Präfix ist Teil der Shellsprache, jedoch nicht Teil der allgemeinen Pfad-Syntax für das gesamte Betriebssystem. An allen anderen Stellen, einschließlich $ PATH (was nicht auf Shells beschränkt ist!), Bedeutet dies einfach ein Verzeichnis mit dem Namen ~.

Bei der Einstellung von $ PATH müssen Sie sicherstellen, dass die Pfade zur Zuweisungszeit erweitert werden:

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

Dieser wird nicht funktionieren:

PATH="$PATH:~/go/bin" 
Das ist unglaublich. Und in der Vergangenheit habe ich in $ PATH und allen anderen Shell-Umgebungsvariablen immer $ HOME verwendet. Dies ist zweifellos eine andere BSD-Coreutils (die von macOS ausgeliefert wird) im Vergleich zu der GNU-Coreutils-Diskrepanz. Ich muss das jetzt auch auf einem Linux-Rechner testen. VxJasonxV vor 6 Jahren 0