Как проверить, доступна ли команда или существует? - PullRequest
3 голосов
/ 28 августа 2011

Я разрабатываю консольное приложение на C на Linux.

Теперь необязательная его часть (это не обязательно) зависит от наличия команды / двоичного файла.

Если япроверьте с system() Я получаю sh: command not found как нежелательный вывод, и он обнаруживает его как существующий.Итак, как я могу проверить, есть ли команда?


Не дубликат Проверьте, существует ли программа из скрипта Bash , поскольку я работаю с C, а не с BASH.

Ответы [ 5 ]

2 голосов
/ 28 августа 2011

Чтобы ответить на ваш вопрос о том, как узнать, существует ли команда с вашим кодом. Вы можете попробовать проверить возвращаемое значение.

int ret = system("ls --version > /dev/null 2>&1"); //The redirect to /dev/null ensures that your program does not produce the output of these commands.
if (ret == 0) {
    //The executable was found.
}

Вы также можете использовать popen , чтобы прочитать вывод. Объединение этого с командами whereis и type, предложенными в других ответах -

char result[255];
FILE* fp = popen("whereis command", "r");
fgets(result, 255, fp);
//parse result to see the path of the bin if it has been found.
pclose(check);

Или используя тип:

FILE* fp = popen("type command" , "r"); 

Результат выполнения команды type немного сложнее, поскольку ее вывод варьируется в зависимости от того, что вы ищете (двоичный, псевдоним, функция, не найден).

0 голосов
/ 29 августа 2011

Я бы просто просмотрел текущую переменную PATH и посмотреть, сможете ли вы найти ее там.Это то, что я недавно сделал с необязательной частью программы, для которой требовалось установить agrep.С другой стороны, если вы не доверяете PATH, но вместо этого у вас есть собственный список путей для проверки, используйте его.

Я сомневаюсь, что вам нужно проверить с помощью оболочки, является ли он встроенным.*

0 голосов
/ 28 августа 2011

Используйте which, вы можете либо проверить значение, возвращаемое system() (0, если найдено), либо вывод команды (без вывода, не найден):

$ which which
/usr/bin/which
$ echo $?
0
$ which does_t_exist
$ echo $?
1
0 голосов
/ 28 августа 2011

Если вы запускаете оболочку, вывод "type commandname" сообщит вам, доступно ли имя команды, и если да, то как оно предоставляется (псевдоним, функция, путь к двоичному файлу). Вы можете прочитать документацию для type здесь: http://ss64.com/bash/type.html

0 голосов
/ 28 августа 2011

Вы можете использовать stat (2) в Linux (или любой POSIX OS), чтобы проверить существование файла.

...