Я использую следующий набор команд для обновления всех моих сайтов WordPress в разделе общего хостинга CentOs на платформе моего хостинг-провайдера (через ежедневный cron).
Команды wpвнутри pushd-popdнабора имеют видWP-CLIпрограмма, которая представляет собой расширение Bash, используемое для различных действий на уровне оболочки на веб-сайтах WordPress.
for dir in public_html/*/; do
if pushd "$dir"; then
wp plugin update --all
wp core update
wp language core update
wp theme update --all
popd
fi
done
Каталог public_html— это каталог, в котором расположены все каталоги веб-сайтов (каждый веб-сайт обычно имеет базу данных и главный файловый каталог).
Учитывая, что public_htmlесть некоторые каталогикоторые не являютсякаталоги сайтов WordPress, то WP-CLI будет возвращать ошибки, касающиеся их.
Чтобы предотвратить эти ошибки, я предполагаю, что могу сделать следующее:
for dir in public_html/*/; do
if pushd "$dir"; then
wp plugin update --all 2>myErrors.txt
wp core update 2>myErrors.txt
wp language core update 2>myErrors.txt
wp theme update --all 2>myErrors.txt
popd
fi
done
Вместо того, чтобы писать 2>myErrors.txtчетыре раза (или больше), есть ли способ гарантировать, что все ошибки, возникающие из каждой команды, будут попадать в один и тот же файл, в одной строке?
решение1
Оператор > fileоткрывает файл fileдля записи, но изначально его обрезает. Это означает, что каждый новый > fileфайл заменяет содержимое файла.
Если вы хотите, чтобы файл myErrors.txtсодержал ошибки всех команд, вам нужно будет либо открыть этот файл только один раз, либо использовать >первый раз и >>все остальные разы (что открывает файл вдобавитьрежим).
Здесь, если вы не против того, чтобы ошибки pushd/ popdтакже отправлялись в файл журнала, вы можете перенаправить весь forцикл:
for dir in public_html/*/; do
if pushd "$dir"; then
wp plugin update --all
wp core update
wp language core update
wp theme update --all
popd
fi
done 2>myErrors.txt
Или вы можете открыть файл журнала на файловом дескрипторе выше 2, например 3, и использовать 2>&3(или 2>&3 3>&-чтобы не засорять команды файловыми дескрипторами, которые им не нужны) для каждой команды или группы команд, которые вы хотите перенаправить в файл журнала:
for dir in public_html/*/; do
if pushd "$dir"; then
{
wp plugin update --all
wp core update
wp language core update
wp theme update --all
} 2>&3 3>&-
popd
fi
done 3>myErrors.txt
решение2
Вы можете использовать фигурные скобки, чтобыгруппаблок и перенаправить весь вывод:
for dir in public_html/*/; do
if pushd "$dir"; then
{
wp plugin update --all
wp core update
wp language core update
wp theme update --all
} 2>myErrors.txt
popd
fi
done


