我正在寻找一个非常简单的解释/教程是什么标志。 我明白,标志工作表明一个命令该怎么做。 例如:
rm -Rf test
我知道rm命令会删除testing文件夹,而-Rf标志将强制该命令不仅擦除文件夹而且擦除其中的文件。
但是,标志在哪里读取/编译? 什么处理标志? 例如,我可以编写我自己的C / C ++程序并指定不同的标志,以便程序做不同的事情吗? 我希望我提出正确的问题。 如果没有,请让我知道。
这个简单的程序应该演示传递给程序的参数(包括程序名称本身)。
解析,解释和使用这些参数取决于程序员(你),虽然有库可以帮助。
int main(int argc, char* argv[]) { int i; for(i=0; i<argc; ++i) { printf("Argument %d : %s\n", i, argv[i]); } return 0; }
如果你把这个程序编译成a.out
,并运行它:
prompt$> ./a.out ParamOne ParamTwo -rf xc
你应该看到输出:
Argument 0 : a.out Argument 1 : ParamOne Argument 2 : ParamTwo Argument 3 : -rf Argument 4 : xc
在C级别,程序的命令行参数出现在main
函数的参数中。 例如,如果你编译这个程序:
#include <stdio.h> int main(int argc, char **argv) { int i; for (i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]); return 0; }
并用与你的例子'rm'命令相同的参数调用它,你会得到这个:
$ ./a.out -Rf test argv[0] = ./a.out argv[1] = -Rf argv[2] = test
正如您所看到的, argv
的第一个条目是程序本身的名称,其余的数组条目是命令行参数。
操作系统根本不关心什么是论据; 这取决于你的程序来解释它们。 但是,它们是如何运作的,其中最重要的是以下几点:
-r
, -f
)和长选项,这是两个破折号,后面跟着一个或多个破折号分隔的单词( --recursive
, --frobnicate-the-gourds
)。 只要没有一个参数需要参数(参见下文),简短的选项就可以组合成一个参数( -rf
)。 -x
的参数是argv
条目的其余部分,或者如果该条目中没有更多的文本,那么接下来的argv
条目是否以短划线开头。 --output=outputfile.txt
。 --
意思是“即使看起来像是一个选项,也不要在命令行的这一点之后处理任何东西”。 例如,您可以通过键入rm -- -f
来删除名为“ -f
”的文件。 -
意味着“读取标准输入”。 -v
=是详细的 -q
=安静 -h
=打印一些帮助文字 -o
file =输出到文件 -f
=强制(不要提示确认危险的行为,只要做) 有一堆库可以帮助你解析命令行参数。 这些最便携,但也是最有限的是getopt ,它是当今大多数系统的C库中内置的。 我建议你阅读GNU argp的所有文档,即使你不想使用那个特定的文档,因为它会在公约中进一步教育你。
另外值得一提的是,通配符扩展( rm -rf *
) 在您的程序被调用之前完成。 如果你将上面的示例程序作为./a.out *
在只包含二进制文件和它的源代码的目录中,你会得到
argv[0] = ./a.out argv[1] = a.out argv[2] = test.c
其实你可以编写你自己的C ++程序,它接受像这样的命令行参数:
int main(int argc, char* argv[]){}
变量argc将包含参数的数量,而char *将包含参数本身。
你可以像这样分配参数:
for (int i = 1; i < argc; i++) { if (i + 1 != argc) { if (strcmp(argv[i], "-filename") == 0) // This is your parameter name { char* filename = argv[i + 1]; // The next value in the array is your value i++; // Move to the next flag } } }
在你自己的C程序中,你可以用你认为合适的方式处理命令行选项。 C中的命令行参数以字符串的形式出现在main(int argc,char * argv [])方法的参数中。
如果您想以类似于大多数UNIX命令的方式处理命令行参数,那么您可能要查找的函数是getopt()
祝你好运!
最简单的事情是写你的main()
像这样:
int main(int argc,char * argv []){…
然后在这个主内部决定命令行参数或“标志”发生了什么。 你可以在argv中找到他们,他们的编号是argc。
标志是传递到程序主入口点的参数。 例如,在一个C ++程序中你可以拥有
int main(int arc, char* argv[]){ return 0; }
你的弧是传入的参数的数量,指针给你实际参数的列表。 因此对于
rm -Rf test
argc是3,argv数组将包含你的参数。 注意argc> = 1,因为程序名本身就是计数(rm)。 -RF是你的第二个参数,测试是你的第三个参数。
因此,无论何时在UNIX中输入命令,实质上都是执行程序并传递它们所运行的参数。
如果你真的对unix操作系统感兴趣,你应该查找叉和它们是如何工作的。 但是,如果你对操作系统感兴趣,以及如何执行程序,这对新手来说可能会相当困惑。
GNU libc很可能在你的系统上可用,它有一个名为getopt的库,可以用来以合理的方式解析选项。 有一些例子可以帮助你开始下面链接的文档。
http://www.gnu.org/software/libc/manual/html_node/Getopt.html#Getopt