【问题标题】:Unix shell: how do I check user input to see if it's a valid unix command?Unix shell:如何检查用户输入以查看它是否是有效的 unix 命令?
【发布时间】:2012-10-17 17:44:00
【问题描述】:

我有一个任务,我需要使用 fork() 创建一个 unix shell。我已经让这个工作正常了。现在我需要检查用户输入以查看它是否是有效的 unix 命令。如果它无效(即它的“1035813”)我需要告诉用户输入一个有效的命令。

有没有办法获得所有可能的 unix 命令的列表,以便将用户输入与该列表中的每个字符串进行比较?或者有更简单的方法吗?

【问题讨论】:

  • 你怎么知道某个 UNIX 系统的某个地方没有名为“1035813”的命令?

标签: c shell unix


【解决方案1】:

执行此操作的适当方法是:

  1. 检查它是否是您shell 中的内置命令。例如,cd 可能应该是一个内置命令。
  2. 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));
  }

}

【讨论】:

  • 将 perror(program) 添加到我的 execvp 解决了我的问题。谢谢!
【解决方案2】:

您可以检查which 的输出。如果它不是以which: no &lt;1035813&gt; in blah/blah 开头,那么它可能不是该系统上的命令。

【讨论】:

    【解决方案3】:

    试试看。

    if which $COMMAND
        then echo "Valid Unix Command"
    else
        echo "Non valid Unix Command"
    fi
    

    【讨论】:

      【解决方案4】:

      如果你想知道它是否是一个内置命令,你可以滥用帮助:

      if help $COMMAND >/dev/null || which $COMMAND >/dev/null
         then echo "Valid Unix Command"
      else
         echo "Not a valid command"
      fi
      

      【讨论】:

        猜你喜欢
        • 2016-05-25
        • 2018-08-05
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        • 2014-08-08
        • 2013-08-07
        • 2020-10-25
        相关资源
        最近更新 更多