在c中无法使用系统函数调用Linux命令

spa*_*rth 0 c linux

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

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

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

我的代码是:

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

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

它给了我以下错误:

sh: 1: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

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

但它不起作用.

任何帮助表示赞赏.

Bas*_*tch 8

阅读系统(3).那个C函数(你可能应该避免,更喜欢像&这样的显式系统调用(2))运行POSIX ; 读也popen(3).forkexecve/bin/sh -c

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

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

所以请阅读GNUbash,Advanced Linux Programming和Advanced Bash Scripting Guide的文档......

然后,使用显式系统调用(2)设置管道和重定向,或者编写一些bash或zsh脚本(但可能不是POSIX /bin/sh!)来完成工作.

我不知道是什么amixer sget Master ,但也许你可能会考虑像管道一样

 amixer sget Master | awk -F '[][]' '/dB/ { print $2 }'
Run Code Online (Sandbox Code Playgroud)

(以上管道与POSIX sh兼容,可以从popen(3)调用...)

我很惊讶你需要做所有这些.我想可以通过一些伪文件来查询音量/sys/

了解有关ALSA的更多信息,并通过Linux声音API阅读一些指南