Простая интерактивная оболочка C ++, скрывающая подсказки при перенаправлении ввода

Я пишу простую интерактивную оболочку на C ++. Это должно работать как минимум sh или же bash,

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

#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 < test.in (перенаправить ввод) он производит вывод с подсказками оболочки, такими как:

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

Он выдает правильный вывод (в данном случае просто выводит входную строку), но он «передается» с подсказками.

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

2

Решение

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

Примерно так будет работать:

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

Другие решения

Решение, предложенное ура-а-НТН-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;
}
1

По вопросам рекламы [email protected]