为什么不将重定向输入视为命令行参数?

时间:2019-02-09 07:33:41

标签: c

我正在尝试读取已从文件重定向的命令行参数。我正在使用的命令是./a.out

int main(int argc, char* argv[], char* envp[]) {
    for (int i = 1; i < argc; i++) {
        printf("%s\n", argv[i]);
    }
}

3 个答案:

答案 0 :(得分:3)

shell在为程序准备命令行之前会拦截重定向命令:

myProg <infile -t >outfile

将传递给程序

myProg -t

其中stdinstdout已在路由图开始之前重新路由。因此,该程序再也看不到重新分配。

答案 1 :(得分:0)

除了简单的废止之外,还有很多情况:

dir > myfile.txt

特别是,您可以将输出从一个程序传递到另一个程序:

dir | more

如果将dir命令发送到more命令,它将发送输出。由于程序启动是由OS Shell处理的,因此它也可以处理重定向。

答案 2 :(得分:-1)

因为语言是用这种方式定义的。假设您说的是真的-

全部用户输入必须来自命令行参数,但是从文件重定向的文本可以满足不同功能所需的输入。如果输入显示为命令行参数,则可以实现

考虑此程序:

#include <stdio.h>

int is_dict(char *word)
{
    /* code to look up a dictionary */
    int result = 1;
    return result;
}

int main(int argc, char *argv[])
{
    if(argc == 2 && is_dict(argv[1]))
        printf("%s found", argv[1]);
    return 0;
}

如果以这种方式编写程序来容纳它,那么输入将必须来自命令行参数。 重定向后,您将如何接受输入?要检测丢失的输入,将需要更多的程序开销。

此外,想象一个包含一百万个单词的文本文件:期望每个单词以argv[n]的形式到达是不可行的。

还有其他反对意见。假设程序打印了一系列提示进行响应。用户必须事先知道提示是什么,才能在提示出现之前提供答案。

最后,如果程序是从GUI运行的,那么在运行之前,所有程序的输入都必须编辑成其属性。