Como @schily já explicou, isso não é um problema de shell e não pode ser trabalhado com xargs
, citando, dividindo em mais echo com ;
, etc. Todo o texto de uma ação make é passado como argumento / s para um único execve(2)
e não pode ser maior que o tamanho máximo permitido pelo sistema operacional.
Se você estiver usando o GNU make (o padrão no linux), você pode usar o seu file
e foreach
funções:
TEST = $(shell yes foobar | sed 200000q)
/tmp/junk:
$(file >$@) $(foreach V,$(TEST),$(file >>$@,$V))
@true
.PHONY: /tmp/junk
Isso imprimirá todas as palavras de $(TEST)
separadas por novas linhas no arquivo denominado em $@
. É baseado em um exemplo similar do manual do make. p>
Seu Makefile provavelmente poderia ser retrabalhado em algo mais gerenciável, que não requer recursos sofisticados do GNU, mas é difícil dizer como os trechos que você postou.
Atualização:
Para o snippet exato da pergunta, algo assim poderia ser feito:
.hgignore : .hgignore_extra
$(info Making $@)
$(file >[email protected])
$(file >>[email protected],# Automatically generated by Make. Edit .hgignore_extra instead.)
$(shell tail -n 2 $< >>[email protected])
$(file >>[email protected],)
$(file >>[email protected],# The following files come from the Makefile.)
$(file >>[email protected],syntax: glob)
$(foreach L, $(IGNORE_DIRS) $(CLEAN_FILES) $(CLEAN_DIRS) $(REALCLEAN_FILES), $(file >>[email protected],$L))
@mv -f [email protected] $@
@chmod a-w $@
.PHONY : .hgignore
Eu mudei um pouco, então ele primeiro escreve em .hgignore.new
, e se tudo correr bem, só então mova .hgignore.new
para .hgignore
. Você terá que alterar os espaços de recuo para as guias, porque essa interface dumb está distorcendo os espaços em branco.