Você não deseja usar o sinalizador e
para o operador s///
do perl. -e
avalia o lado direito da substituição como código perl; você não quer avaliar o conteúdo de cat $i
como código perl, você quer que ele seja tratado como texto literal para substituir. Como você está usando aspas simples na linha de comando bash, o texto cat $i
é passado literalmente para perl e é avaliado como uma expressão : o que significa que perl executa um subshell para cat
e o conteúdo (na mente do perl) de $i
- que não é uma variável perl . Sem use strict
, é totalmente legal ter uma variável não declarada, então o perl não reclama quando você diz para ele abrir uma subshell que chama cat
sem argumentos. cat
sem argumentos, claro, apenas aguarda stdin .. é por isso que você vê o script "travar". Você está essencialmente chamando isso:
perl -e ''cat $i';'
Seu erro é evidente se você adicionar use strict
ao seu código perl:
perl -e 'use strict; 'cat $i';'
Seu bloco de código deve ser este:
for i in "${arrOfFiles[@]}"; do
perl -pi -e "s/%REPLACE ME%/'cat $i'/g;" "$OUTPUT_PATH"
done
Observe, no entanto, que isso sempre funcionará no arquivo denominado em $OUTPUT_PATH
, o que significa que o texto %REPLACE ME%
dentro dele será substituído pelo conteúdo do primeiro arquivo em sua matriz de arquivos e, em seguida, nenhum o resto dos arquivos irá substituir qualquer coisa. Não está claro o que exatamente você está tentando fazer aqui. Com os -pi
flags para perl, você está dizendo para editar in-line qualquer um / todos os arquivos fornecidos na linha de comando, que atualmente é apenas $OUTPUT_PATH
.
Também é provavelmente uma maneira geralmente ruim de fazer a substituição de strings - provavelmente há um grande número de caracteres no conteúdo de cada arquivo $i
que pode explodir totalmente sua linha de comando perl. Um único caractere /
será suficiente para causar um erro de sintaxe perl, e provavelmente existem seqüências que executariam código arbitrário via injeção. Você foi avisado.