无法使用c

时间:2015-11-30 06:12:22

标签: c linux

我想用system()函数执行以下命令,

awk -F [][] '/dB/ { print $2 }' <(amixer sget Master) > sound_level

当我在终端写入时,它给了我想要的输出。 但是当我在C中使用系统函数调用此命令时,它会给我错误。

我的代码是:

#include<stdio.h>
#include <stdlib.h>

int main()
{
        system("awk -F [][] '/dB/ { print $2 }' <(amixer sget Master) > sound_level");
        return 0;
}

它给了我以下错误:

sh: 1: Syntax error: "(" unexpected

我也尝试过:

awk -F [][] '/dB/ { print $2 }' < /(amixer sget Master /) > sound_level

但它不起作用。

感谢任何帮助。

1 个答案:

答案 0 :(得分:8)

阅读system(3)。那个C函数(你可能应该避免,更喜欢明确syscalls(2),如fork&amp; execve)正在运行POSIX /bin/sh -c;另请阅读popen(3)

但是您的交互式shell可能是bash,其行为与POSIX sh不同,特别是对于<(amixer sget Master)等重定向

为了使事情变得更复杂,/bin/bash 程序在被调用为sh时,会将其行为更改为POSIX sh,因此在许多系统上,{ {1}}是/bin/sh的符号链接...

另请阅读GNU bashAdvanced Linux ProgrammingAdvanced Bash Scripting Guide的文档...

然后,使用显式syscalls(2)设置管道和重定向,或者编写一些/bin/bashbash脚本(但​​可能不是POSIX zsh脚本!)做这项工作。

我不知道/bin/sh做了什么,但也许您可能会考虑像

这样的管道
amixer sget Master

(并且上面的管道与POSIX amixer sget Master | awk -F '[][]' '/dB/ { print $2 }' 兼容,因此可以从popen(3)调用...)

我很惊讶你需要做所有这些。我想可以通过sh

中的一些伪文件来查询音量

详细了解ALSA并阅读一些Guide thru the Linux sound API