我有一个大型音乐目录,列在名为op
的文件中。我已经能够构建一个命令,它将使用来自date命令的纳秒输出的一些创造性数学从op
文件中随机选择一首歌。它在命令行中运行良好:
sed -n $((10#$(date +%N)%$(wc -l /shared/southpark/music/op|cut -d ' ' -f 1)))p /shared/southpark/music/op
我想在c程序中包含此命令,并使用popen读取该行。
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[])
{
char command[201];
char buf[501];
FILE *fp;
strcpy(command, "sed -n $((10#$(date +%N)%$(wc -l /shared/southpark/music/op|cut -d ' ' -f 1)))p /shared/southpark/music/op");
if((fp = popen(command, "r")) == NULL)
{
fprintf(stderr, "music_player: popen failed\n");
return(1);
}
if(fgets(buf, sizeof(buf), fp) == NULL)
{
fprintf(stderr, "music_player: fgets failed\n");
return(1);
}
printf("%s\n", buf);
pclose(fp);
return(0);
}
但是当我运行它时,我收到以下错误:
sh: 1: arithmetic expression: expecting EOF: "10#271445839%2278"
music_player: fgets failed
我该怎么做?我不理解错误信息。
答案 0 :(得分:2)
popen
使用
/bin/sh -c "command"
并且您的sh
无法理解10#
基本转化前缀。您之前已在bash
中运行该命令。
要解决此问题,您有两种选择:
10#
兼容性sh
前缀(这是默认设置)
使用bash
:
popen("bash -c 'command'", ...)
答案 1 :(得分:0)
在使用nneonneo的两个选项尝试失败之后,我不得不求助于将命令放在bash脚本文件中,然后我开始编写脚本。它给了我想要的结果。
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[])
{
char command[201];
char buf[501];
FILE *fp;
strcpy(command, "/dea/testing/popen/get_file");
if((fp = popen(command, "r")) == NULL)
{
fprintf(stderr, "music_player: popen failed\n");
return(1);
}
if(fgets(buf, sizeof(buf), fp) == NULL)
{
fprintf(stderr, "music_player: fgets failed\n");
return(1);
}
printf("%s", buf);
pclose(fp);
return(0);
}