无法理解为什么这会导致错误
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
中的命令。
要修复,您有两个选择:
- 丢弃不必要的
10#
前缀(这是默认值)以实现 sh
兼容性
使用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);
}
我有一个很大的音乐目录,列在一个名为 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
中的命令。
要修复,您有两个选择:
- 丢弃不必要的
10#
前缀(这是默认值)以实现sh
兼容性 使用
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);
}