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.


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.


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.


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.


4
command -v assemble.sh

Die Info

-v Gibt eine Beschreibung von COMMAND aus, die dem eingebauten Typ ähnelt

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.