0

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

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

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

有没有办法让这条消息静音,或者我应该ls | grep -i myscript在运行这条线之前打电话?

4

2 回答 2

2

假设您/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.10sh都可以正常工作。)

由于您需要为任何非标准系统重新编译应用程序,您始终可以编辑宏以省略前缀。(如果你找到了这样的系统,你可以很容易地在魔法中添加一个测试以Makefile在必要时自动省略它。)

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

问题?

于 2012-09-27T15:08:54.240 回答
0

我不太确定你是否可以扼杀信息。该错误是打印到标准错误流上的标准 Linux 错误。您可以保留 FD '2',它是标准错误的文件描述符。所以也许你可以关闭这个FD。

但是,我必须警告您,这将防止为您的程序的其余部分打印任何错误。

更好的方法是: snprintf(cmd, MAX_PATH, "/myscript -q | grep -i %s 2> dummyfile", deviceName);

这会将错误重定向到您立即删除的虚拟文件。

所以谨慎行事并决定你想做什么......

干杯,VSN

于 2012-09-27T14:31:51.450 回答