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

1

Eu tenho o seguinte conjunto de comandos usado para atualizar todos os meus sites do WordPress na minha partição de hospedagem compartilhada CentOs na plataforma do meu provedor de hospedagem (via cron diário).

Os comandos wp dentro do pushd-popd set, são do programa WP-CLI , que é uma extensão Bash usada para várias ações no nível do shell em sites do 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 em que todos os diretórios do site estão localizados (cada site geralmente tem um banco de dados e um diretório de arquivos principal).

Dado que public_html tem alguns diretórios que não são diretórios de sites do WordPress, então, o WP-CLI retornaria erros em relação 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.txt quatro vezes (ou mais), existe uma maneira de garantir que todos os erros, de todos os comandos, irão para o mesmo arquivo, em uma linha?

    
por user9303970 29.05.2018 / 16:08

2 respostas

5

O operador > file abre o file para gravação, mas o trunca inicialmente. Isso significa que cada novo > file faz com que o conteúdo do arquivo seja substituído.

Se você quiser que o myErrors.txt contenha o erro de todos os comandos, será necessário abrir o arquivo apenas uma vez ou usar > na primeira vez e >> nas outras vezes (que abre o arquivo no modo append ).

Aqui, se você não se importar com os erros pushd / popd para também ir para o arquivo de log, é possível redirecionar todo o for loop:

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ê poderia 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
    
por 29.05.2018 / 18:05
3

Você pode usar chaves para grupo um bloco e redirecionar 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
    
por 29.05.2018 / 16:25