2015-09-20 3 views
1

Я хочу, чтобы выполнить следующую командуexecvp игнорировать аргументы '

ubus -S call network.interface status '{"interface": "lan"}' 

с execvp в C:

char* arg[] = {"ubus", "-S", "call", "network.interface" , "status", "'{\"interface\": \"lan\"}'", NULL}; 
execvp(arg[0],arg); 

но команда не работает. Я делаю расследование, и я обнаружил, что причина в 5-м аргументе ('{"interface": "lan"}') содержит специальный атрибут ', который выглядит проигнорированным execvp.

Как избежать этой проблемы?

+0

«* execvp игнорировать аргументы с«*» Это не будет. Попробуйте заменить 'ubus' на' echo'. – alk

+1

Также 'arg' пропускает конечный' NULL' дозорный. Это должно быть 'char * arg [] = {..., NULL};' – alk

ответ

3

Неверный путь .. аргумент читается {"interface": "lan"}, не'{"interface": "lan"}'. Кавычки предназначены только для вашей оболочки, поэтому он знает, что пробел внутри принадлежит аргументу, а не разделитель между двумя аргументами. ubus никогда их не увидит.

редактировать: лучше сказать ubusдолжны не увидеть их, потому что в вашей реализации, он делает, и это просто неправильный синтаксис ubus.

2

Вы не показали свой код, но эквивалентный execvp вызов будет выглядеть примерно так:

char *args[] = { 
    "ubus", "-S", "call", "network.interface", "status", "{\"interface\": \"lan\"}", NULL 
}; 
execvp("ubus", args);