Suchen Sie eine Datei im Pfad ohne "welche"?

12

Ich kann (irgendwie) ein Skript ausführen:

$ assemble.sh file
... [output]

Aber whichkann es nicht finden:

$ which assemble.sh
which: no assemble.sh in (/s/std/bin:/usr/afsws/bin:/opt/SUNWspro/bin:/usr/ccs/bin:/usr/ucb:/bin:/usr/bin:/usr/stat/bin:/usr/X11R6/bin:.
  1. Wie ist das möglich?
  2. Wie finde ich heraus, wo sich diese Datei befindet?

Ich benutze Bash.

Xodarap
quelle
Ist assemble.shin Ihrem aktuellen Verzeichnis?
Keith
3
Wahrscheinlich eine dumme Frage, aber ist es ein Alias ​​(dh wird assemble.sh angezeigt, wenn Sie den Befehl alias
James McLeod
@JamesMcLeod Großartige Vermutung! Es war mein Fall für acme.sh ( github.com/Neilpang/acme.sh ). Nach der Installation wurde der Alias ​​acme.sh erstellt und ich habe mich gefragt, wie acme.sh aufgerufen wird, obwohl es sich nicht in PATH var befindet.
Rlib

Antworten:

17

Verwenden Sie diesen Befehl: type assemble.sh

Es funktioniert in einer Vielzahl von Muscheln und zeigt nur das erste Ergebnis.

Glenn Jackman
quelle
9
Oder einfach type assemble.sh, was portabel ist (und nur die erste Übereinstimmung anzeigt, wohingegen type -aes sich um ein ksh / bash-Konstrukt handelt, das alle Übereinstimmungen anzeigt ).
Gilles 'SO - hör auf böse zu sein'
6

Oder teilen Sie den Pfad und verwenden Sie ihn bei der Suche - die erste Übereinstimmung sollte die Lösung sein

find ${PATH//:/ } -maxdepth 1 -name assemble.sh -print -quit

type ist natürlich einfacher.

Benutzer unbekannt
quelle
2
Das ist ziemlich nützlich. Ich wusste nicht, dass ich $ PATH in seine Unterkomponenten find
aufteilen
1
Ich habe es nicht versucht, aber ich denke, dies kann mit Leerzeichen in Komponenten von PATH
brechen
4

Möglicherweise verwenden Sie bash, aber die Syntax der whichAusgabe zeigt, dass Sie die whichin csh geschriebene alte verwenden . Der PATH wird in Klammern angegeben, und die Verzeichnisse in PATH haben Einträge wie /opt/SUNWspro/binund, /usr/ccs/bindie nur in Solaris sinnvoll sind. Das ist konsequent: Solaris verwendete die csh which.

Hier ist meine Vermutung: Sie haben einen PATH für Bash und einen anderen für CSH. Dies könnte ein Systemproblem sein. Wie ich mich erinnere, speichert Solaris die Dateien / etc / profile und / etc / cshrc für die systemweite PATH-Einstellung. Diese beiden Initialisierungsdateien können unterschiedliche PATH-Variablen für unterschiedliche Shells festlegen. Geben Sie unter bash "echo $ PATH" ein und prüfen Sie, ob es mit dem übereinstimmt, was der whichBefehl als PATH-Zeichenfolge ausgibt.

Bruce Ediger
quelle
4
command -v assemble.sh

Die Info

-v Gibt eine Beschreibung von COMMAND aus, die dem eingebauten Typ ähnelt
Steven Penny
quelle
Auch wäre nützlich, wenn Sie in einer modifizierten Version von PATHASSEMBLE=$(PATH=/usr/bin:/usr/local/opt/coreutils/libexec/gnubin command -v assemble.sh)
nhed
0

Mit können locate assemble.shSie den Speicherort der Datei ermitteln.

nico
quelle
Nein, dies zeigt den Speicherort aller (welt-) lesbaren Dateien, deren Namen enthalten assemble.sh, was hier irrelevant ist.
Gilles 'SO - hör auf böse zu sein'
Es ist überhaupt nicht irrelevant. Selbst wenn er mehrere Dateien wie diese locatehätte , würde er auch den Ort der Datei finden, die er haben möchte. assemble.shist kein so gebräuchlicher Dateiname, daher wird er die Datei wahrscheinlich leicht finden (was das OP verlangt).
Nico
1
Musst du nicht updatedbvorher locateErgebnisse zeigen?
Glenn Jackman
1
Normalerweise updatedbwird es täglich als Cron-Job ausgeführt, aber Sie müssen es möglicherweise erzwingen, wenn die Datei sehr aktuell ist.
Nico