【问题标题】:C++ simple interactive shell prompt hiding when redirecting input重定向输入时隐藏 C++ 简单的交互式 shell 提示
【发布时间】:2016-01-15 07:55:25
【问题描述】:

我正在用 C++ 编写一个简单的交互式 shell 程序。它应该与shbash 类似。

程序看起来像这样(尽可能简化):

#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 &lt; test.in(重定向输入)运行 shell,它会产生带有这样的 shell 提示的输出:

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

它确实产生了正确的输出(在这种情况下只是输出输入字符串)但是它被提示“污染”了。

重定向输入时是否有一些相当简单的方法来摆脱它(如果我对例如bash 做同样的事情,输出中没有提示)? 提前谢谢你

【问题讨论】:

标签: c++ shell prompt


【解决方案1】:

假设您在 *NIX 类型的系统上运行,您可以(并且应该)使用 isatty 来测试标准输入是否连接到 tty(交互式终端)。

这样的事情会起作用:

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

【讨论】:

    【解决方案2】:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2020-06-14
      • 2019-07-29
      • 1970-01-01
      相关资源
      最近更新 更多