参数中的命令行分配

时间:2013-07-17 07:52:45

标签: c

是否可以像下面这样的参数进行命令?

./exe FROM_FILE=true 

在这种情况下,我在程序中的期望是,当FROM_FILE值为true时,我将从文件中获取数据,如果为false,我可以采用标准值。我找到的其他替代方法是使用

  1. -options
  2. 简单地传递参数。但在这种情况下,我不得不担心论证的顺序。
  3. 在制作makefile时会想到这个。

    $>cat makefile
    exe     :
            echo ${FROM_FILE}
    $>make FROM_FILE=true
    echo true
    true
    $>
    

4 个答案:

答案 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");
}