Quando você abre um arquivo para gravar com > , ele é truncado antes mesmo de você lê-lo. É por isso que está vazio.
Alternativa com um arquivo temporário (sim, isso é bastante comum):
php -r "…" < build/index.php > tmp
mv tmp build/index.php
O ideal é usar mktemp para gerar um arquivo temporário exclusivo:
tmp="$(mktemp /tmp/file.XXX)"
php -r "…" < build/index.php > "$tmp"
mv "$tmp" build/index.php
Mas isso não é realmente mais curto ou mais conciso.
Meu favorito pessoal é o utilitário sponge de moreutils - lê a entrada e, em seguida, grava no arquivo:
php -r "…" < build/index.php | sponge build/index.php
Ou, melhor ainda, não faça a substituição em PHP, mas uma ferramenta que suporte edição no local, como o Perl com:
perl -pi -e '…' build/index.php
Semelhante a sed , aqui o sinalizador no local para o GNU sed :
sed -i -e '…' build/index.php
E para o BSD sed , você precisa de um argumento vazio explícito para -i :
sed -i '' -e '…' build/index.php
Você provavelmente terá que adaptar seu comando de expressão regular / substituição para a sintaxe do Perl e do sed, respectivamente.