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.