我正在寻找关于标志是什么的非常简单的解释/教程。我知道标志工作表明命令要做什么。例如:
rm -Rf test
我知道 rm 命令将删除测试文件夹,并且 -Rf 标志将强制命令不仅删除文件夹,而且删除其中的文件。
但是,标志在哪里读取/编译???什么处理标志?例如,我可以编写自己的 C/C++ 程序并指定不同的标志,以便程序执行不同的操作吗?我希望我问的是正确的问题。如果没有,请告诉我。
我正在寻找关于标志是什么的非常简单的解释/教程。我知道标志工作表明命令要做什么。例如:
rm -Rf test
我知道 rm 命令将删除测试文件夹,并且 -Rf 标志将强制命令不仅删除文件夹,而且删除其中的文件。
但是,标志在哪里读取/编译???什么处理标志?例如,我可以编写自己的 C/C++ 程序并指定不同的标志,以便程序执行不同的操作吗?我希望我问的是正确的问题。如果没有,请告诉我。
在 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
。--
意思是“不要将命令行上此点之后的任何内容视为选项,即使它看起来像一个选项。” 例如,您可以-f
通过键入 删除名为 ' '的文件rm -- -f
。-
表示“读取标准输入”。-v
= 冗长-q
= 安静-h
= 打印一些帮助文本-o
文件= 输出到文件-f
= 强制(不提示确认危险动作,直接执行)有很多库可以帮助您解析命令行参数。其中最可移植但也是最受限制的是getopt,它内置于当今大多数系统的 C 库中。我建议您阅读GNU argp的所有文档,即使您不想使用那个特定的文档,因为它会进一步教育您了解约定。
还值得一提的是,通配符扩展 ( rm -rf *
) 是在您的程序被调用之前完成的。./a.out *
如果您在仅包含二进制文件及其源代码的目录中运行上述示例程序,您将获得
argv[0] = ./a.out
argv[1] = a.out
argv[2] = test.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 x.c
你应该看到输出:
Argument 0 : a.out
Argument 1 : ParamOne
Argument 2 : ParamTwo
Argument 3 : -rf
Argument 4 : x.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[]) { ...
然后在该 main 中,您决定命令行参数或“标志”会发生什么。您在 argv 中找到它们,它们的编号是 argc。
标志是传递到程序主入口点的参数。例如,在 C++ 程序中,您可以拥有
int main(int arc, char* argv[]){
return 0;
}
你的弧是传入的参数的#,指针给你实际参数的列表。因此对于
rm -Rf test
argc 为 3,而 argv 数组将包含您的参数。注意 argc >= 1 因为程序名称本身很重要 (rm)。-RF 是您的第二个参数,而 test 是您的第三个参数。
因此,每当您在 unix 中键入命令时,您实际上是在执行程序并向它们传递它们操作的参数。
如果你真的对 unix 操作系统很感兴趣,你应该查看 fork 以及它们是如何工作的。不过,这对于新手来说可能会很困惑,所以只有当你真的对操作系统和程序的执行方式感兴趣时。
GNU libc 很可能在您的系统上可用,它有一个名为 getopt 的库,可用于以合理的方式解析选项。下面链接的文档中有一些示例可以帮助您入门。
http://www.gnu.org/software/libc/manual/html_node/Getopt.html#Getopt