Когда вы открываете файл для записи с помощью >
, он усекается еще до того, как вы его прочитаете. Вот почему это пусто.
Альтернатива с временным файлом (да, это довольно часто):
php -r "…" < build/index.php > tmp
mv tmp build/index.php
В идеале используйте mktemp
для генерации уникального временного файла:
tmp="$(mktemp /tmp/file.XXX)"
php -r "…" < build/index.php > "$tmp"
mv "$tmp" build/index.php
Но это на самом деле не короче и не лаконичнее.
Мой личный фаворит - утилита sponge
от moreutils - она читает ввод и затем записывает в файл:
php -r "…" < build/index.php | sponge build/index.php
Или, что еще лучше, не делайте подстановку в PHP, а используйте инструмент, который поддерживает редактирование на месте, например, Perl с:
perl -pi -e '…' build/index.php
Как и в случае с sed
, здесь флаг на месте для GNU sed
:
sed -i -e '…' build/index.php
А для BSD sed
вам нужен явный пустой аргумент для -i
:
sed -i '' -e '…' build/index.php
Вам, вероятно, придется адаптировать свою команду регулярного выражения / подстановки для синтаксиса Perl и sed соответственно.