我有一个任务,我需要使用 fork() 创建一个 unix shell。我已经让这个工作正常了。现在我需要检查用户输入以查看它是否是有效的 unix 命令。如果它无效(即它的“1035813”),我需要告诉用户输入一个有效的命令。
有没有一种方法可以获得每个可能的 unix 命令的列表,以便我可以将用户输入与该列表中的每个字符串进行比较?或者有没有更简单的方法来做到这一点?
执行此操作的适当方法是:
cd
应该可能是一个内置命令。fork
并尝试exec
它。(execvp
实际上可能是您真正想要的)。如果失败,请检查errno
以确定原因。例子:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char* argv[])
{
if (argc != 2) {
printf("usage: %s <program-to-run>\n", argv[0]);
return -1;
}
char* program = argv[1];
/* in this case we aren't passing any arguments to the program */
char* const args[] = { program, NULL };
printf("trying to run %s...\n", program);
pid_t pid = fork();
if (pid == -1) {
perror("failed to fork");
return -1;
}
if (pid == 0) {
/* child */
if (execvp(program, args) == -1) {
/* here errno is set. You can retrieve a message with either
* perror() or strerror()
*/
perror(program);
return -1;
}
} else {
/* parent */
int status;
waitpid(pid, &status, 0);
printf("%s exited with status %d\n", program, WEXITSTATUS(status));
}
}
您可以检查which
. 如果它没有开始,which: no <1035813> in blah/blah
那么它可能不是该系统上的命令。
试试看。
if which $COMMAND
then echo "Valid Unix Command"
else
echo "Non valid Unix Command"
fi
如果您想知道它是否是内置命令,您可以滥用帮助:
if help $COMMAND >/dev/null || which $COMMAND >/dev/null
then echo "Valid Unix Command"
else
echo "Not a valid command"
fi