я делаю проект об оболочке, и я хочу код, который дает мне путь система () функциональное использование.
пример, когда я ввожу команду
введите dir
ответ будет
dir является внешней командой (/bin/dir)
это - то, чего я достиг, но не работа
else if(strcmp(arg3[0],"type")==0) //if type command
{
if(strcmp(arg3[1],"cat")==0 || strcmp(arg3[1],"rm")==0 || strcmp(arg3[1],"rmdir")==0 || strcmp(arg3[1],"ls")==0 || strcmp(arg3[1],"cp")==0 || strcmp(arg3[1],"mv")==0 || strcmp(arg3[1],"exit")==0 || strcmp(arg3[1],"sleep")==0 || strcmp(arg3[1],"type")==0|| strcmp(arg3[1],"history") ==0)
{
printf("%s is a Rshell builtin\n", arg3[1]);
}
else
{
printf("%s is an external command\n", arg3[1]);
char * pPath;
pPath = getenv ("PATH");
if (pPath!=NULL)
printf ("The current path is: %s",pPath);
}
}
Похоже, что вы ищете команду which
:
$ which ls
/bin/ls
Два способа:
Прежде всего, обратите внимание, что system () будет использовать другую оболочку, а не вашу. В большинстве реализаций по умолчанию используется / bin / sh, который может быть оболочкой Bourne или bash ... вам нужно выяснить, что делает ваша среда выполнения c. popen () почти всегда делает то же самое, что и system (), в любом случае это правда на Solaris, HPUX и с glibc.
FILE *cmd=popen("/usr/bin/echo $PATH");
char tmp[256]={0x0};
if (cmd!=NULL)
{
while (fgets(tmp, sizeof(tmp), cmd)!=NULL)
printf("%s", tmp);
pclose(cmd);
}
/* or */
system("/usr/bin/echo $PATH");
Если вы спрашиваете, как работает функция поиска команды «type», она просто ищет все каталоги, содержащиеся в переменной среды PATH, пока не найдет указанный файл (который должен быть выполнен пользователем). Это довольно легко реализовать самостоятельно - я не думаю, что есть функция библиотеки POSIX, которая это делает, но я не эксперт по POSIX.
Вы всегда можете попробовать загрузить открытый исходный код для whereis
, который является стандартным для большинства дистрибутивов Linux, прочитать его и посмотреть, как он реализован.