c - 在 popen 中窒息 "file or directory not found"消息

标签 c linux popen

我正在使用 popen 来运行系统脚本,如下所示:

snprintf(cmd, MAX_PATH, "/myscript -q | grep -i %s", deviceName);
FILE *res = popen(cmd, "r");

如果未找到脚本,程序将继续其愉快的方式。但是,会显示“找不到文件或目录”消息,这看起来像是一个错误,即使在我的预期用途中它不是。

有没有办法让这个消息静音,或者我应该直接调用 ls | grep -i myscript 在运行此行之前?

最佳答案

假设您的 /bin/sh 是一个 POSIX shell,或者一个相当新的 Bourne shell 变体,您可以在执行实际命令之前在命令中重定向标准输出。您只需要在要执行的命令之前添加 exec 2>/dev/null ;

以下是我个人的做法:

/* Shell syntax for redirecting standard error to /dev/null, to
 * silence any errors. If /bin/sh does not support this, you can
 * simply replace it with an empty string.
*/
#define  POPEN_STDERR_NULL "exec 2>/dev/null ;"

...

snprintf(cmd, MAX_PATH, POPEN_STDERR_NULL "/myscript -q | grep -i -e '%s'", deviceName);
FILE *res = popen(cmd, "r");

popen() 命令在内部使用/bin/sh 来运行指定的命令。以上适用于我可以测试的所有 /bin/sh 变体,包括 Linux 和 SunOS 5.10,因此它应该非常便携。 (换句话说,dashbash 和 SunOS 5.10 sh 都可以正常工作。)

由于您需要为任何非标准系统重新编译应用程序,因此您始终可以编辑宏以省略前缀。 (您可以轻松地将测试添加到 Makefile 魔术中,以便在必要时自动忽略它,如果您找到这样的系统。)

请注意,我修改了 snprintf() 调用中的参数替换。它适用于任何包含单引号的deviceName。在 snprintf() 调用之前,deviceName 中的任何单引号都应替换为字符串 '"'"'

有问题吗?

关于c - 在 popen 中窒息 "file or directory not found"消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622826/

相关文章:

c - 链接器找不到现有的静态库文件

c - fgets 中的段错误,试图在 c 程序中运行 shell 命令

c++ - 外部内联函数 gcc

c - 哪个 printf() 会更快,为什么?

regex - 优化 sed 字符串

node.js - 无法在 Linux 上安装 @angular/cli

ruby -/proc目录脚本

python - 通过 Python 运行 Windows CMD 命令

c - *p 包含什么?

linux - 如果任何人都可以执行 sudo,那么 Linux 中的权限有何意义?