Lorsque vous ouvrez un fichier en écriture >, celui-ci est tronqué avant même de le lire. C'est pourquoi c'est vide.
Alternative avec un fichier temporaire (oui, c'est assez courant):
php -r "…" < build/index.php > tmp
mv tmp build/index.php
Idéalement, utilisez mktemppour générer un fichier temporaire unique:
tmp="$(mktemp /tmp/file.XXX)"
php -r "…" < build/index.php > "$tmp"
mv "$tmp" build/index.php
Mais ce n'est pas vraiment plus court ou plus concis.
Mon favori personnel est l’ spongeutilitaire de moreutils - il lit les entrées puis écrit dans le fichier:
php -r "…" < build/index.php | sponge build/index.php
Ou, mieux encore, ne faites pas la substitution en PHP, mais un outil qui supporte l'édition sur place, comme Perl avec:
perl -pi -e '…' build/index.php
Similaire avec sed, ici, le drapeau en place pour GNU sed:
sed -i -e '…' build/index.php
Et pour BSD sed, vous avez besoin d'un argument vide explicite pour -i:
sed -i '' -e '…' build/index.php
Vous devrez probablement adapter votre commande expression régulière / substitution à la syntaxe de Perl et de sed, respectivement.