【发布时间】:2023-04-10 01:50:01
【问题描述】:
我有一个很大的音乐目录,列在一个名为op 的文件中。我已经能够构建一个命令,该命令将使用一些创造性的数学从 op 文件中随机选择一首歌曲,并使用 date 命令的纳秒输出。从命令行可以正常工作:
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
我该怎么做?我不理解错误消息。
【问题讨论】:
-
您知道
$RANDOM变量或sort -R命令吗? -
等等,如果你在写 C,为什么还要调用 shell?
-
@o11c - 为什么他不应该从 C 程序调用 shell?
-
@Cyclone 因为大多数 shell 功能都是用 C 轻松实现的,没有子进程的开销。