Перенаправить все строки кода в один и тот же файл в одной строке

Перенаправить все строки кода в один и тот же файл в одной строке

Я использую следующий набор команд для обновления всех моих сайтов 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

Связанный контент