Znajdź plik na ścieżce bez „który”?

12

Jestem (jakoś) w stanie uruchomić skrypt:

$ assemble.sh file
... [output]

Ale whichnie mogę tego znaleźć:

$ 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. Jak to jest możliwe?
  2. Jak mogę znaleźć gdzie jest ten plik?

Używam bash.

Xodarap
źródło
Jest assemble.shw twoim bieżącym katalogu?
Keith,
3
Prawdopodobnie głupie pytanie, ale czy jest to alias (tzn. Czy po złożeniu polecenia pojawia się assemble.sh alias ?
James McLeod,
@JamesMcLeod Świetnie zgadnij! Tak było w przypadku acme.sh ( github.com/Neilpang/acme.sh ). Po instalacji utworzono alias acme.sh i zastanawiałem się, jak wywoływany jest acme.sh, mimo że nie jest w zmiennej PATH var.
rlib

Odpowiedzi:

17

Użyj tego polecenia: type assemble.sh

Działa w różnych powłokach i pokazuje tylko pierwszy wynik.

Glenn Jackman
źródło
9
Lub po prostu type assemble.sh, który jest przenośny (i pokazuje tylko pierwsze dopasowanie, podczas gdy type -ajest konstrukcją ksh / bash, która pokazuje wszystkie dopasowania).
Gilles „SO- przestań być zły”
6

Lub podziel ścieżkę i użyj jej w znalezieniu - pierwszym rozwiązaniem powinno być rozwiązanie

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

type jest oczywiście łatwiejsze.

nieznany użytkownik
źródło
2
Jest to dość przydatne. Nie wiedziałem, że mogę podzielić $ PATH na jego find
podskładniki
1
Nie próbowałem, ale myślę, że to może zerwać ze spacjami w elementach ŚCIEŻKI
nhed
4

Być może używasz bash, ale składnia danych whichwyjściowych pokazuje, że używasz starego whichnapisanego w csh. PATH pokazuje się w nawiasach, a katalogi w PATH mają wpisy podobne /opt/SUNWspro/bini /usr/ccs/binktóre mają sens tylko w Solarisie. To spójne: Solaris użył csh which.

Oto moje przypuszczenie: masz jedną ŚCIEŻKĘ na bash, a drugą na csh. Może to być problem z systemem. O ile pamiętam, Solaris przechowuje pliki / etc / profile i / etc / cshrc dla ustawienia PATH w całym systemie. Te dwa pliki inicjujące mogą ustawiać różne zmienne PATH dla różnych powłok. Wykonaj „echo $ PATH” pod bash i sprawdź, czy zgadza się z tym, co whichpolecenie wypisuje jako ciąg PATH.

Bruce Ediger
źródło
4
command -v assemble.sh

Informacje

-v wypisuje opis POLECENIA podobny do wbudowanego `type '
Steven Penny
źródło
Również byłoby przydatne, jeśli chce się znaleźć w zmodyfikowanej wersji PATHASSEMBLE=$(PATH=/usr/bin:/usr/local/opt/coreutils/libexec/gnubin command -v assemble.sh)
nhed
0

Możesz użyć, locate assemble.shaby znaleźć lokalizację pliku.

Nico
źródło
Nie, pokazuje lokalizację wszystkich (czytelnych na całym świecie) plików, których nazwa zawiera assemble.sh, co nie ma tutaj znaczenia.
Gilles „SO- przestań być zły”
To wcale nie jest bez znaczenia. Nawet jeśli miał tak wiele wywoływanych plików, locatepodałby mu lokalizację tego, którego chce. assemble.shnie jest tak powszechną nazwą pliku, więc prawdopodobnie łatwo go znajdzie (czego żąda OP).
nico
1
Nie musisz updatedbwcześniej locatepokazywać wyników?
glenn jackman
1
Zwykle updatedbjest uruchamiany codziennie jako zadanie crona, ale tak, może być konieczne wymuszenie go, jeśli plik jest najnowszy.
nico