2015-06-19 64 views
0

我有一個大型的音樂目錄,名爲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 

我怎樣才能做到這一點?我不理解錯誤消息。

+0

認爲這可能是一個重複的http://stackoverflow.com/questions/15882799/fgets-returning-error-for-file-returned-by-popen – Cyclonecode

+0

你知道了'$ RANDOM'變量,還是'sort -R'命令? – o11c

+1

等等,爲什麼你在寫C時調用shell? – o11c

回答

0

後嘗試和nneonneo的選擇都失敗,我不得不求助於放置命令一個bash腳本文件,然後我popen'ed腳本。它給了我想要的結果。

#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); 
} 
2

popen執行使用

/bin/sh -c "command" 

和你sh不理解10#基轉換前綴的命令。您以前一直在運行bash中的命令。

要解決,你有兩個選擇:

  1. 丟棄不必要10#前綴(這是默認值)爲sh兼容性
  2. 使用bash

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

我必須使用十進制轉換,因爲日期的納秒選項將包含與前面的嘗試混淆的前導零。 – Deanie

+0

並將命令改爲'strcpy(command,「bash -c \」sed -n $((10#$(date +%N)%$(wc -l/shared/southpark/music/op | cut -d ''-f 1)))p/shared/southpark/music/op \「」);'創建了與上面相同的錯誤。 – Deanie

+0

而不是使用'date +%N',然後考慮使用'($ {RANDOM} << 15)+ $ {RANDOM}',它使用'bash'內置的隨機數生成器。 – nneonneo

相關問題