是否可以像下面这样的参数进行命令?
./exe FROM_FILE=true
在这种情况下,我在程序中的期望是,当FROM_FILE值为true时,我将从文件中获取数据,如果为false,我可以采用标准值。我找到的其他替代方法是使用
在制作makefile时会想到这个。
$>cat makefile exe : echo ${FROM_FILE} $>make FROM_FILE=true echo true true $>
答案 0 :(得分:5)
你可以做到
FROM_FILE=true ./exe
然后使用environ
指针或getenv()
从应用程序内部读取FROM_FILE环境变量。见http://linux.die.net/man/7/environ
答案 1 :(得分:0)
编辑:我越是想到它,它就越不像打破常见的命令行界面惯例。也许你应该读这个:http://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html
你试过环境变量吗?
你可以做到
FROM_FILE=true ./exe
和exe.c:
[...]
char *file = getenv("FROM_FILE");
if (file == NULL)
*file = DEFAULT;
[...]
或者,对于命令行界面的更多GNU-ish方法,请查看getopt或argp。 (http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html#Parsing-Program-Arguments)
答案 2 :(得分:0)
可能?好吧,因为make显然是这样做的(我自己没试过),显然可能。它可能会绊倒一些人,因为它肯定是一种不寻常的语法。
你想要做的事情可能是迭代argv[]
,找到something=something
表格上的任何参数,然后做你的魔术。在完成它们之后,甚至可能将它们归零,然后做一些更正常的事情,例如将咕噜咕噜的工作交给getopt
或类似的库。
要考虑的一件事,特别是如果您希望这是通用的,当有人将文件名传递给包含=
的应用程序时,该怎么做,期望文件名被打开,处理或等等这是你的申请以谋生为生。
答案 3 :(得分:0)
当然有可能!像这样(未经测试):
int main(int argc, char **argv)
{
int FROM_FILE = 0;
const char *FROM_FILE_key = "FROM_FILE";
int i;
/* Iterate through all the arguments. */
for (i = 1; i < argc; ++i)
{
/* Look for the '='. If not there, skip this argument. */
char *eq = strchr(argv[i], '=');
if (!eq)
continue;
/* Compare the key. If not what we want, skip it. */
if (strncmp(argv[i], FROM_FILE_key, strlen(FROM_FILE_key)) != 0)
continue;
/* Parse the value. You probably want to make this more flexible
(true, 1, yes, y...)*/
if (strcmp(eq+1, "true") == 0)
FROM_FILE = 1;
}
printf("FROM_FILE=%s", FROM_FILE? "true" : "false");
}