найти команду на $ PATH - PullRequest
       11

найти команду на $ PATH

2 голосов
/ 02 сентября 2011

Я пишу сценарий, и мне нужно найти команду в $ PATH пользователя и получить полный путь к команде. Проблема в том, что я не знаю, что такое оболочка входа пользователя или какие странные вещи могут быть в их файлах do. Я использую оболочку Bourne для моего простого маленького скрипта, потому что он должен работать на некоторых старых платформах Solaris, которые могут не иметь bash.

Некоторые реализации «which» и «fromce» будут источником точечных файлов пользователя, и это не совсем переносимо для всех пользователей. Мне бы понравилась простая утилита UNIX, которая просто выполняла бы основную работу по сканированию PATH на наличие исполняемого файла и сообщала полный путь первого совпадения.

Но я согласен на любое решение / bin / sh, стабильное для всех пользователей.

Я ищу решение, которое лучше, чем написание моего собственного цикла / bin / sh, который прерывает $ PATH и ищет его по одной строке за раз. Казалось бы, это достаточно распространено, и для этого должен быть способ многократного использования.

Мое первое приближение к «длинному пути» таково:

   IFS=:
   for i in $PATH; do
      if [ -x $i/$cmd ]; then
          echo $i/$cmd
      fi
   done

Есть ли что-нибудь более простое и портативное?

Ответы [ 3 ]

3 голосов
/ 02 сентября 2011

Кажется, что ответ встроенный.

% /bin/sh
$ type ls
ls is /bin/ls
0 голосов
/ 14 января 2017

Ответ на этот вопрос подробно здесь: https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then. Итог: используйте command -v ls.

0 голосов
/ 02 сентября 2011

Может быть, команда whereis подойдет вам?

whereis -b -B `echo $PATH | sed 's/:/ /g'` -f [commands]

например. на моем компьютере это работает:

whereis -b -B `echo $PATH | sed 's/:/ /g'` -f find man fsc

И результаты:

find: /usr/bin/find
man: /usr/bin/man
fsc: /opt/FSharp-2.0.0.0/bin/fsc.exe /opt/FSharp-2.0.0.0/bin/fsc

Одно предупреждение из справочной страницы whereis:

   Since whereis uses chdir(2V) to run faster, pathnames given
   with the -M, -S, or -B must be full; that is, they must begin
   with a `/'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...