Как я могу реализовать функциональность, подобную программе, которая?

Я хотел бы узнать, установлена ​​ли в системе программа less. Мне не разрешено использовать прямой system("which less") из-за моих требований. Итак, я собираюсь попробовать PATHs в переменной PATH и выполнить stat для файлов, чтобы увидеть, установлено ли меньше. Но как добавить меньше к каждому из моих PATH? Я начал с этого кода

pathValue = getenv ("PATH");
if (! pathValue) {
    printf ("'%s' is not set.\n", "PATH");
}
else {
    printf ("'%s' is set to %s.\n", "PATH", pathValue);
}

Теперь он правильно печатает мой PATH, но я не знаю, что делать дальше. Можете вы помочь мне? Я думаю, что я должен токенизировать свой pathValue, как я могу это сделать?

$ ./a.out 'PATH' is set to /home/developer/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games.

person Niklas R.    schedule 19.05.2015    source источник
comment
google добавление строки C, не так ли?   -  person Eregrith    schedule 19.05.2015
comment
возможный дубликат добавления строки C   -  person Eregrith    schedule 19.05.2015
comment
@Eregrith Да, но я должен токенизировать PATH, я думаю,   -  person Niklas R.    schedule 19.05.2015
comment
Ну, вы гуглили строку C tokenize? И, кстати, если вы не можете придумать ни малейшего представления о том, как можно токенизировать строку, то ничто из того, что мы вам скажем, вам никоим образом не поможет.   -  person Peter - Reinstate Monica    schedule 19.05.2015
comment
Между прочим, вопрос на удивление действительно имеет интересный аспект, а именно то, что имя каталога в *nix-подобных ОС может содержать любой символ, кроме '/' и '\0'; в частности, он может содержать двоеточие. Хотя такие каталоги могут быть только у патологических умов, мне не сразу ясно, - и если: как - вы, which или оболочка распознали бы их, если бы они были в PATH. (Ну, оболочка всегда может хранить элементы PATH в массиве и сделать PATH переменной только для чтения, объединенной из элементов массива. Но тогда скрипты (и программы), пытающиеся установить PATH, потерпят неудачу.)   -  person Peter - Reinstate Monica    schedule 19.05.2015
comment
@PeterSchneider Я думаю, у тебя есть хороший вопрос :) задай его!   -  person Eregrith    schedule 19.05.2015
comment
@Eregrith Я не думаю, что есть решение. Парадигма простого и глупого текста в Unix просто иногда кусает нас.   -  person Peter - Reinstate Monica    schedule 19.05.2015
comment
@PeterSchneider Хм, я не знаю, мне это кажется довольно большим предостережением. Я думаю, что путь, содержащий каталог с : в его имени, также является большим недостатком безопасности...   -  person Eregrith    schedule 19.05.2015
comment
@PeterSchneider из любопытства я искал его и вот ответ   -  person Eregrith    schedule 22.05.2015


Ответы (1)


Я считаю, что getenv ("PATH"); возвращает указатель на строку, например,

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Ясно, как мы видим, разные пути к каталогам разделены :. Так,

  1. Вы можете начать токенизировать pathValue, используя strtok() и : в качестве разделителя. Каждый результирующий токен должен действовать как путь к каталогу для проверки файла.
  2. Проверьте наличие, используя stat().
person Sourav Ghosh    schedule 19.05.2015