我有以下命令集用于更新我的托管提供商平台上的 CentOs 共享托管分区中的所有 WordPress 站点(通过每日 cron)。
wp
该组内的命令pushd-popd
是WP-CLI程序,它是一个 Bash 扩展,用于 WordPress 网站上的各种 shell 级操作。
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
目录public_html
是所有网站目录所在的目录(每个网站通常有一个数据库和一个主文件目录)。
鉴于public_html
有一些目录哪些不是WordPress 网站目录,然后 WP-CLI 将返回有关它们的错误。
为了防止这些错误,我想我可以这样做:
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
2>myErrors.txt
有没有一种方法可以确保每个命令中的所有错误都会在一行中写入同一个文件,而不是写入四次(或更多)?
答案1
运算> file
符打开file
进行写入,但最初将其截断。这意味着每个新文件> file
都会导致文件内容被替换。
如果您希望myErrors.txt
包含所有命令的错误,则需要仅打开该文件一次,或者使用>
第一次和>>
其他时间(在附加模式)。
在这里,如果您不介意pushd
/popd
错误也转到日志文件,您可以重定向整个for
循环:
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
或者,您可以在高于 2、3 的 fd 上打开日志文件,并使用2>&3
(或2>&3 3>&-
以免用不需要的 fd 污染命令)您想要重定向到日志文件的每个命令或命令组:
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
答案2
您可以使用花括号团体一个块并重定向所有输出:
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