如何在C语言终端包装程序中精确回显标准输出?
实现原生终端风格的命令错误提示
这个问题我之前也碰到过,核心原因是**popen默认调用的是/bin/sh,而你的原生终端大概率用的是bash(或者zsh这类更友好的shell)**,不同shell的错误提示文案本来就不一样,所以才会出现输出不一致的情况。
解决方案:指定popen调用bash来执行命令
只需要修改popen的第一个参数,把要执行的命令包裹在bash -c里,让bash来处理命令执行,这样就能得到和原生终端一致的错误提示了。
修改后的代码示例:
// 假设buffer里是用户输入的命令,比如"asd" char cmd[BUFF_SIZE * 2]; snprintf(cmd, sizeof(cmd), "bash -c '%s'", buffer); // 用bash包裹原命令 FILE *output = popen(cmd, "r"); if (!output) { // 处理popen失败的情况 perror("popen failed"); return; } memset(buffer, '\0', BUFF_SIZE * 2); while (fgets(buffer, sizeof(buffer), output) != NULL) { printf("%s", buffer); memset(buffer, '\0', BUFF_SIZE * 2); } int ret = pclose(output); // 可以根据ret判断命令执行状态,比如非0表示执行出错
验证效果
当输入asd时,修改后的代码会输出和原生终端一致的内容:
No command 'asd' found, but there are 24 similar ones
asd: command not found
额外说明
如果你的原生终端用的是zsh或者其他shell,只需要把bash -c换成对应的shell命令(比如zsh -c)就行,原理是一样的——让popen调用和终端相同的shell来执行命令,就能得到完全一致的输出(包括错误提示、命令补全建议等)。
内容的提问来源于stack exchange,提问作者bli00
相关产品推荐
相关产品推荐

