Найти файл по пути без «который»?


12

Я (как-то) могу запустить скрипт:

$ assemble.sh file
... [output]

Но whichне могу найти это:

$ 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. Как это возможно?
  2. Как я могу найти, где находится этот файл?

Я использую Bash.


Находится assemble.shв вашем текущем каталоге?
Кит

3
Возможно, глупый вопрос, но является ли он псевдонимом (то есть, появляется ли alias файл
Джеймс МакЛауд,

@JamesMcLeod Отличное предположение! Это был мой случай для acme.sh ( github.com/Neilpang/acme.sh ). После установки был создан псевдоним acme.sh, и мне было интересно, как вызывается acme.sh, несмотря на то, что он отсутствует в переменной PATH.
Rlib

Ответы:


17

Используйте эту команду: type assemble.sh

Работает в разных оболочках и показывает только первый результат.


9
Или просто type assemble.sh, который является переносимым (и показывает только первое совпадение, тогда как type -aявляется конструкцией ksh / bash, чтобы показать все совпадения).
Жиль "ТАК - перестань быть злым"

6

Или разделите путь, и используйте его в find - первое совпадение должно быть решением

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

type конечно проще.


2
Это довольно полезно. Я не знал, что смогу разбить $ PATH на его подкомпоненты и искать каждый с помощьюfind
Ehtesh Choudhury

1
Не пытался, но я думаю, что это может порваться с пробелами в компонентах PATH
nhed

4

Возможно, вы используете bash, но синтаксис whichвывода показывает, что вы используете старый, whichнаписанный на csh. Путь , показывает вверх , указанные в скобках, и каталоги в PATH есть записи , как /opt/SUNWspro/binи /usr/ccs/binкоторые имеют смысл только в Solaris. Это соответствует: Solaris использовал csh which.

Вот мое предположение: у вас есть один PATH для bash, а другой для csh. Это может быть системной проблемой. Насколько я помню, Solaris сохраняет файлы / etc / profile и / etc / cshrc для общесистемной настройки PATH. Эти два файла инициализации могут устанавливать разные переменные PATH для разных оболочек. Выполните «echo $ PATH» в bash и посмотрите, соответствует ли оно тому, что whichкоманда выводит в виде строки PATH.


4
command -v assemble.sh

Информация

-v вывести описание КОМАНДЫ, аналогичное встроенному типу

Также было бы полезно, если вы хотите найти в модифицированной версии PATHASSEMBLE=$(PATH=/usr/bin:/usr/local/opt/coreutils/libexec/gnubin command -v assemble.sh)
nhed

0

Вы можете использовать, locate assemble.shчтобы найти местоположение файла.


Нет, это показывает расположение всех (мировых) читаемых файлов, чье имя содержит assemble.sh, что здесь не имеет значения.
Жиль "ТАК - перестань быть злым"

Это не имеет никакого отношения вообще. Даже если бы у него было несколько названных файлов, locateэто также дало бы ему местоположение того, что он хочет. assemble.shэто не очень распространенное имя файла, поэтому он, скорее всего, легко найдет файл (это то, что запрашивает OP).
Нико

1
Вы не должны , updatedbпрежде чем locateпоказаны результаты?
Гленн Джекман

1
Обычно updatedbзапускается ежедневно как задание cron, но, возможно, вам придется его принудительно запускать, если файл очень свежий.
Нико
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.