无法理解为什么会导致错误

时间:2015-06-19 05:27:59

标签: c linux popen fgets

我有一个大型音乐目录,列在名为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

我该怎么做?我不理解错误信息。

2 个答案:

答案 0 :(得分:2)

popen使用

执行您的命令
/bin/sh -c "command"

并且您的sh无法理解10#基本转化前缀。您之前已在bash中运行该命令。

要解决此问题,您有两种选择:

  1. 放弃10#兼容性
  2. 的不必要的sh前缀(这是默认设置)
  3. 使用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);
}