Redirigir todas las líneas de código al mismo archivo en una sola línea

Redirigir todas las líneas de código al mismo archivo en una sola línea

Tengo el siguiente conjunto de comandos utilizado para actualizar todos mis sitios de WordPress en mi partición de alojamiento compartido CentOs en la plataforma de mi proveedor de alojamiento (a través de cron diario).

Los wpcomandos dentro del pushd-popdset, son del tipoWP-CLIprograma, que es una extensión de Bash utilizada para varias acciones a nivel de shell en sitios web de 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

El directorio public_htmles el directorio en el que se encuentran todos los directorios de sitios web (cada sitio web suele tener una base de datos y un directorio de archivos principal).

Dado que public_htmltiene algunos directorios.que no sonDirectorios de sitios web de WordPress, WP-CLI devolvería errores con respecto a ellos.

Para evitar estos errores, supongo que podría hacer:

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

En lugar de escribir 2>myErrors.txtcuatro veces (o más), ¿hay alguna manera de garantizar que todos los errores de cada comando vayan al mismo archivo, en una línea?

Respuesta1

El > fileoperador abre el archivo filepara escribir pero lo trunca inicialmente. Eso significa que cada novedad > filehace que se reemplace el contenido del archivo.

Si desea que myErrors.txtcontenga el error de todos los comandos, necesitará abrir ese archivo solo una vez o usar >la primera vez y >>las otras veces (lo que abre el archivo enadjuntarmodo).

Aquí, si no le importa que los errores pushd/ popdvayan también al archivo de registro, puede redirigir todo el forbucle:

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

O puede abrir el archivo de registro en un fd superior a 2, 3, por ejemplo, y usarlo 2>&3(o 2>&3 3>&-para no contaminar los comandos con fds que no necesitan) para cada comando o grupo de comandos que desee redirigir al archivo de registro. :

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

Respuesta2

Puedes usar llaves paragrupoun bloque y redirigir toda la salida:

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

información relacionada