2013-09-29 3 views
1

Я хочу проверить, вводит ли пользователь что-то вроде ls& или ls &, так что я смогу установить bg_flag для фоновых заданий в оболочке. однако следующий код не может быть проверен на ls&&. потому что я не хочу, чтобы это считалось фоновой работой (я не уверен, что это то же самое в оболочке Linux), если пользователь вводит ls&& или что-то еще с более чем одним & в конце.Как проверить, является ли экземпляр подстроки в конце строки и только один раз (скажем, используя strstr)?

if (strstr(args[arg_count-1],"&")!=NULL) 
    //if (strcmp(args[arg_count-1],"&")==0) 
       { 
       bg_flag=1; 
       printf("I am a background job %d ",getpid()); 
       } 

Сообщите мне, что это подходящий способ для этого?

+0

Возможно, что-то вроде «strstr (p,« & ») &&! Strstr (p," && ")"? –

ответ

4

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

Для примера рассмотрим следующее:

some_program \&& 

она заканчивается двумя амперсандами (&&), но в любом случае это будет фоновый процесс, потому что первая амперсанд экранированы (\&).

Однако маркировка постфикса \&& в качестве «фона» тоже не правильно, потому что

some_program \\&& 

не был бы фоновый процесс (но неполная команда вместо этого).

И до тех пор, пока вы не определяете правильную грамматику, очень вероятно, что вы не будете правильно улавливать все, как могут показаться мои два примера.

Другими проблемами могут быть программы, которые отделяются от терминала (иногда называемого демонанизацией). Они не связаны с оболочкой, они делают то же самое сами по себе.

+0

Вы говорите мне, что оболочка Linux рассматривает ls && как вложенные фоновые задания? –

+0

Typo: «он заканчивается двумя амперсандами». +1 –

+0

Спасибо, исправлено :-) –

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

  • Нет связанных вопросов^_^