Как мне проверить, является ли команда «выполнимой» в PHP?

#php

#php

Вопрос:

file_exists() проверяет, существует ли файл.

Однако «pg_ctl» является допустимой командой в моей системе, потому что C:PostgreSQLbin находится в моей PATH , поэтому запуск «pg_ctl» действительно выполняется C:PostgreSQLbinpg_ctl.exe .

file_exists сообщит, что «pg_ctl» не существует, но он все еще «вроде» существует, поскольку он может выполняться.

Как мне проверить, преобразуется ли заданный путь ИЛИ строка, такая как «pg_ctl», в допустимую команду?

Я уже пробовал с realpath . Она возвращает логическое значение false для realpath('pg_ctl') , так что это не работает.

Комментарии:

1. Смотрите is_executable() .

2. @AlexHowansky var_dump(is_executable('pg_ctl')); = bool(false)

3. is_executable() требуется полный путь к файлу (иначе он выглядит в текущем каталоге) — он не будет пересекать ваш ПУТЬ. PHP не заботится о вашем пути (или не знает о нем) — это особенность оболочки, а не PHP. Если вы хотите просмотреть каталоги в пути, вам нужно будет сделать это самостоятельно.

4. @AlexHowansky Весь смысл был в том, чтобы проверить наличие команды…

5. PHP не является оболочкой, он не имеет понятия о том, что такое «команда». Вместо командной строки exec (чего вам никогда не следует делать) вам придется написать код для разделения ПУТИ по двоеточию, выполнить итерацию по каталогам и запустить is_executable() для имени команды, как если бы это был файл в этом каталоге.

Ответ №1:

В Windows вы можете использовать where.exe который вернет путь к файлу, если он существует в path.

 shell_exec('where pg_ctl');
  

Должен вернуться:

C:PostgreSQLbinpg_ctl.exe

Поэтому проверьте наличие этого в выходных данных:

 $cmd = 'pg_ctl';
var_dump( strpos(shell_exec("where $cmd"), $cmd) !== false );
  

Комментарии:

1. @AlexHowansky ИНФОРМАЦИЯ: Не удалось найти файлы для данного шаблона (ов). но, как и во всем, не доверяйте пользовательскому вводу, но, похоже, в этом вопросе это не так.

2. Она по-прежнему выполняет вторую команду после генерации этого сообщения об ошибке. Попробуйте where foo amp; bar , и вы получите информационное сообщение, а затем сообщение об ошибке о невозможности запуска bar.

3. @AlexHowansky Я знаю концепцию, но мой c: все еще не поврежден 😉

4. Если я правильно помню (прошло некоторое время), формат запрашивает подтверждение пользователя по умолчанию, и есть переключатель типа y , чтобы пропустить его, но я не собираюсь это проверять. 🙂