2014-12-11 5 views
0

Я вызываю утилиту, установленную в unix из программы на C с помощью system(). Вход для вызова утилиты имеет аргументы, разделенные точками с запятой. как указано ниже.Как избежать точки с запятой в системной функции C

snprintf(buffer, sizeof(buffer), ". /path/to/program/env.sh && utilityname command WKS#%s\;at=%s", strmnm,dte); 
      system(buffer); 

Проблема в том, что аргументы после точки с запятой игнорируются/рассматриваются как следующая команда. Я попытался убежать с '\', как указано выше \; Но это не работает.

+0

Вы пробовали прохождение '\\\;'? – Leeor

+0

Только что попробовал WKS #% s \\\; at =% s и он предупреждает: неизвестная escape-последовательность '\;' – Kevin

ответ

3

system вызывает оболочку. В Unix это чаще всего либо производная от sh, либо производная от csh. POSIX указывает только sh (спасибо @KeithThompson). Оба семейства оболочек обрабатывают неэкономный ; в качестве разделителя команд.

Чтобы избежать символа в соответствии с правилами оболочки, перед ним следует обратная косая черта или заключить его в кавычки. C имеет свои правила относительно котировок и обратных косых черт в строках, поэтому требуется больше обратных косых черт. Одиночные кавычки имеют приятное свойство не нуждаться в обратных косых чертах в строках C.

Таким образом, любой из них должен работать:

"..... ';' ....." 

"..... \";\" ....." 

"..... \\; ....." 
+0

POSIX специально требует 'system()' для вызова 'sh'; Я не думаю, что он когда-либо вызовет оболочку с производной 'csh' (если вы не сообщите об этом, но даже тогда' sh' выполнит команду 'csh'). –

+0

Большое спасибо @ н.м. Это работало как прелесть "..... \"; \ "....." – Kevin

Смежные вопросы