2013-05-16 117 views
1

我想将内容转储到列表中,但我不知道现在如何解决此问题。“参数列表太长”显示所有列表元素

当我尝试显示列表中的所有元素,外壳显示:

参数列表太长

Makefile中:

$(FILE_SOURCE:%= echo % >> $(FILE_LIST_TMP);) 

消息:

execvp: /bin/sh: Argument list too long 

有没有其他方法可以在不重新编译内核的情况下解决这个问题?

我将不胜感激任何建议。谢谢

现在我用perl来解决这个问题。以下是我的方法:你可以在命令行中短得多

while read line; do 
    perl -e 'print "$$ARGV[0]\n"' $$line >> $(FILE_LIST_TMP) ; \ 
done < $(FILE_SOURCE)` 
+1

这里的两个例子完全不同。在第一个文件中,看起来'FILE_SOURCE'是一个make变量,其中包含一长串文件,在第二个文件中,似乎'FILE_SOURCE'是一个make变量,它包含文件的文件名,其中包含一长串文件。你的情况如何?如果你显示如何定义'FILE_SOURCE',我们可以提供更多的帮助。 – MadScientist

+0

就像说明一样,对于第二个例子,你可以运行'cp $(FILE_SOURCE)$(FILE_LIST_TMP)',这会简单得多,而且速度更快。 – MadScientist

回答

2

一种方法是在每一个回声不使用$(FILE_LIST_TMP)。相反,只使用了一次,像这样:

(${FILE_SOURCE:%=echo %;}) > $(FILE_LIST_TMP) 

现在,而不是发送到这个壳:

echo foo >> my_temp_file ; echo bar >> my_temp_file ; echo baz >> my_temp_file; .. 

你会使用这个:

(echo foo; echo bar; echo baz;) > my_temp_file 

这将是显著更短,特别是随着文件数量的增加,特别是如果临时文件名是长时间的。

另一个窍门,你可以玩,如果在FILE_SOURCE文件都在,有一个共同的路径中的子目录,是cd有,那么你可以省略从echo线这条道路。

但是,即使这可能最终不够,如果列表足够长。

+0

从GNU make 4.0开始,你也可以使用'file'函数在调用shell之前首先将内容写入文件。请参阅http://www.gnu.org/software/make/manual/html_node/File-Function.html – MadScientist