2013-07-17 3 views
3

Возможно ли сделать команду как аргументы, как показано ниже?Назначение командной строки в аргументах

./exe FROM_FILE=true 

Вот в этом случае, как я ожидаю в программе есть, когда значение FROM_FILE верно, я Виль брать данные из файла и если ложно, то я могу принять стандартные значения. Другие альтернативы я нахожу для этой цели является использование

  1. -options
  2. Просто передайте аргументы. Но в этом случае я должен беспокоиться о порядке аргументов.

Этот вопрос пришло в голову при создании файла makefile.

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

вы можете подумать о файле конфигурации. сохраните 'FROM_FILE = true' в файле конфигурации – MOHAMED

ответ

5

Вы можете сделать

FROM_FILE=true ./exe 

, а затем прочитать переменную окружения FROM_FILE внутри приложения с environ указателем или getenv(). См. http://linux.die.net/man/7/environ

+0

да. Я пытался, и это работает.Но я должен найти другой способ, так как я не буду запускать приложение с консоли, вместо этого я попрошу моего диспетчера задач, который ожидает его как taskman run binaryname [arguments] [arguments] .. – adarsh

0

EDIT: Чем больше я думаю об этом, тем менее хорошая идея, похоже, нарушается с общими соглашениями интерфейса командной строки. возможно, вы должны это прочитать: 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-иш подход к командной строки интерфейсов, взглянуть на Getopt или argp. (http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html#Parsing-Program-Arguments)

0

Возможно ли? Ну, так как make явно делает это (я сам не пробовал), это, очевидно, возможно. Это может потренировать некоторых людей, потому что это, безусловно, необычный синтаксис.

Что бы вы хотели сделать, это, вероятно, перебрать более argv[], найти любые параметры на форме something=something и сделать свою магию. Возможно, даже обнулите их после того, как вы закончите с ними, а затем сделайте что-то более нормальное, например, раздайте работу с помощью getopt или аналогичную библиотеку.

Следует учитывать, что если вы хотите, чтобы это было общим, то что делать, когда кто-то передает имя файла вашему приложению, содержащее =, ожидая, что имя файла будет открыто, обработано или каким бы то ни было ваше приложение для жизни.

0

Конечно, это возможно! Что-то вроде этого (untested):

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"); 
} 
Смежные вопросы