Я пишу простую интерактивную оболочку на 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
в выводе нет подсказки) при перенаправлении ввода?
заранее спасибо
Предполагая, что вы работаете в системе типа * NIX, вы можете (и должны) использовать isatty
проверить, подключен ли stdin к tty (интерактивный терминал).
Примерно так будет работать:
if (isatty(STDIN_FILENO)) {
std::cout << "prompt> ";
} // else: no prompt for non-interactive sessions
Решение, предложенное ура-а-НТН-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;
}