我的程序需要接受以下三种输入命令:
./Myprogram input.txt
./Myprogram < input.txt
./Myprogram我正在考虑使用argc检查参数的数量,以解决前两种情况(因为重定向不算参数)。但是,我坚持使用最后一种情况,它只是等待用户输入。
我想知道是否有一种方法可以判断shell命令中是否存在重定向?
对于更复杂的场景,比如混合使用重定向和argv表单(见下文)。有没有办法做到这一点,或者这只是一个接受用户命令的糟糕的设计?
./Myprogram input1.txt input2.txt input3.txt
./Myprogram input1.txt < input2.txt input3.txt
./Myprogram任何帮助都将不胜感激!
Z.Zen
发布于 2010-10-19 11:57:57
重定向永远不会被您的程序视为参数。所以在:
./Myprogram input.txt
./Myprogram < input.txt
./Myprogram第二种和第三种形式是相同的。至于你的第二种可能性:
./Myprogram input1.txt input2.txt input3.txt
./Myprogram input1.txt < input2.txt input3.txt
./Myprogram第二行相当于:
./Myprogram input1.txt input3.txt < input2.txt而且它也无法与:
./Myprogram input1.txt input3.txt(唯一不同的是标准输入的实际来源)。
一些程序处理来自标准输入和在命令行上指定的文件的混合输入的典型方式是接受"-"作为特殊的文件名,这意味着“在参数列表中的这个位置使用标准输入作为输入文件”。如果参数列表为空,许多这样的程序将默认处理"-"的单例列表。
发布于 2010-10-19 12:04:24
基本算法是:
if (there are no arguments left after parsing options)
call_function(stdin);
else
{
foreach remaining argument
{
FILE *fp;
if (strcmp(argument, "-") == 0)
call_function(stdin);
else if ((fp = fopen(argument, "r")) == 0)
...error handling...
else
{
call_function(fp);
fclose(fp);
}
}
}您也可以将文件名传递给'call_function()‘,有时我会使用指定的输出文件流来编写代码。该函数('call_function()')处理一个文件-读取到文件的末尾。它不会关闭该文件;它被赋予了一个打开的文件,并且不应该关闭它。
当然,第一个“if”处理I/O重定向的情况。
多年来,我写了一个函数来处理这个循环。每当我需要用这种“UNIX过滤器”习惯用法编写命令时,它就简化了我的生活--这是相当常见的。再加上一个标准化的错误报告包,它大大简化了工作。将其作为函数还允许我在其上使用变体,例如在文件被覆盖之前创建文件备份的变体,或者在函数成功完成时安全地覆盖文件的变体。
发布于 2010-10-19 12:04:01
@R..对于通常的情况是正确的。
如果您希望在情况#3而不是#2中具有交互行为,除了让终端按行缓冲用户的输入之外,还可以使用isatty (特别是isatty(0))来确定另一端是否有人。
这不是标准的C语言,但也不是终端或shell的概念!
https://stackoverflow.com/questions/3965212
复制相似问题