Redirecione todas as linhas de código para o mesmo arquivo em uma única linha

Redirecione todas as linhas de código para o mesmo arquivo em uma única linha

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

informação relacionada