2013-05-16 2 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)', который будет намного проще и LOT быстрее. – 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', чтобы сначала записать содержимое в файл перед вызовом оболочки. См. Http://www.gnu.org/software/make/manual/html_node/File-Function.html. – MadScientist