Eu tenho o seguinte conjunto de comandos usado para atualizar todos os meus sites WordPress na minha partição de hospedagem compartilhada CentOs na plataforma do meu provedor de hospedagem (via cron diário).
Os wpcomandos dentro do pushd-popdconjunto são do tipoWP-CLIprograma, que é uma extensão Bash usada para várias ações em nível de shell em sites 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
O diretório public_htmlé o diretório no qual todos os diretórios de sites estão localizados (cada site geralmente possui um banco de dados e um diretório de arquivos principal).
Dado que public_htmltem alguns diretóriosque não sãoOs diretórios de sites WordPress, portanto, o WP-CLI retornaria erros relacionados a eles.
Para evitar esses erros, presumo que poderia fazer:
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
Em vez de escrever 2>myErrors.txtquatro vezes (ou mais), existe uma maneira de garantir que todos os erros de cada comando irão para o mesmo arquivo, em uma linha?
Responder1
O > fileoperador abre o arquivo filepara escrita, mas o trunca inicialmente. Isso significa que cada novo > filefaz com que o conteúdo do arquivo seja substituído.
Se quiser que myErrors.txtcontenha o erro de todos os comandos, você precisará abrir esse arquivo apenas uma vez ou usar >a primeira vez e >>as outras vezes (que abre o arquivo emacrescentarmodo).
Aqui, se você não se importa que os erros pushd/ popdtambém acessem o arquivo de log, você pode redirecionar todo o forloop:
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
Ou você pode abrir o arquivo de log em um fd acima de 2, 3 por exemplo, e usar 2>&3(ou 2>&3 3>&-para não poluir comandos com fds que eles não precisam) para cada comando ou grupo de comandos que você deseja redirecionar para o arquivo de log :
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
Responder2
Você pode usar chaves paragrupoum bloco e redirecione toda a saída:
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


