2015-10-16 2 views
2

Я пишу простую интерактивную программу оболочки на C++. Он должен работать simalary до sh или bash.C++ простая интерактивная приглашение командной оболочки при перенаправлении ввода

Программа выглядит следующим образом (упрощенно как можно больше):

#include <iostream> 
#include <string> 

int main(){ 
    std::string command; 

    while (1){ 
     std::cout << "prompt> "; 
     std::getline(std::cin, command); 
     std::cout << command << std::endl; 
     if (command.compare("exit") == 0) break; 
    } 

    return 0; 
} 

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

Однако, если я бегу оболочки, как это ./shell < test.in (перенаправление ввода) производит выход с оболочкой подсказывает, как это:

prompt> echo "something" 
prompt> echo "something else" 
prompt> date 
prompt> exit 

Это действительно производит правильный вывод (только выход входной строки в данном случае), но это 'poluted' с подсказками.

Есть ли какой-то довольно простой способ избавиться от него (если я делаю то же самое, например, bash нет вывода на выходе) при перенаправлении ввода? Заранее спасибо

+5

http://linux.die.net/man/3/isatty –

ответ

1

Предполагая, что вы работаете на * NIX системы типа, вы можете (и должны) использовать isatty, чтобы проверить, является ли STDIN подключен к TTY (интерактивный терминал).

Что-то, как это будет работать:

if (isatty(STDIN_FILENO)) { 
    std::cout << "prompt> "; 
} // else: no prompt for non-interactive sessions 
1

Решение, предлагаемое cheers-and-hth-alf, работает для меня. Благодаря

Решение:

#include <iostream> 
#include <string> 
#include <unistd.h> 

int main(){ 
    std::string command; 

    while (1){ 
     if (isatty(STDIN_FILENO)){ 
      std::cout << "prompt> "; 
     } 
     std::getline(std::cin, command); 
     std::cout << command << std::endl; 
     if (command.compare("exit") == 0) break; 
    } 

    return 0; 
} 
Смежные вопросы