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

Can't understand why this causes an error

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

我该怎么做?我不明白错误消息。

popen 使用

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

并且您的 sh 不理解 10# 基本转换前缀。您之前已经 运行 bash 中的命令。

要修复,您有两个选择:

  1. 丢弃不必要的 10# 前缀(这是默认值)以实现 sh 兼容性
  2. 使用bash:

    popen("bash -c 'command'", ...)
    

在尝试使用 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);
}