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


