检查来自C程序的UNIX命令行参数,管道和重定向

时间:2010-02-07 09:26:31

标签: c unix command-line arguments

一旦我发现缺少命令行参数,我有一些问题要弄清楚如何维护管道和重定向shell的功能。

例如,如果我使用scanf调用,那将使用重定向或来自shell的管道,但如果没有这个,我会得到一个我不想要的提示。

我想通过argv [],管道或重定向接受命令行参数但是我无法弄清楚如何在得到提示时这样做。如果我举例如下:

if(argc < 2)
    exit(0);

如果我尝试这个程序,程序将终止:

echo arg | myProgram

或者这个:

myProgram < fileWithArgument

我试过看一下,但我总是得到一些bash脚本参考。

3 个答案:

答案 0 :(得分:7)

处理这种情况的常用方法是使用isatty或类似功能检查标准输入流是否连接到终端,具体取决于您的操作系统。如果是,则从命令行获取参数,如果没有(它被重定向),则读取标准输入。

答案 1 :(得分:2)

简短版本:你无法做到。

管道和重定向说明符不是程序的参数,而是它们是调用shell的命令,并且在程序的运行实例存在之前进行处理。 shell没有将它们传递给argv中的程序或任何其他变量,你无法以任何可靠的方式发现它们。

尼尔已经给了你the way to determine if you are connected to a terminal

答案 2 :(得分:0)

在您的示例中,您使用管道重定向,echo arg | myProgrammyProgram < filesWithArguments都将输出发送到程序的 STDIN

如果您想阅读这些值,请在 STDIN 文件描述符上使用scanffread

如果您尝试将文件内容作为可执行文件的参数列表,则需要像这样使用它:

# This will pass `lala` as a variable
myProgram `echo lala`