将所有代码行重定向到同一文件中的一行

将所有代码行重定向到同一文件中的一行

我有以下命令集用于更新我的托管提供商平台上的 CentOs 共享托管分区中的所有 WordPress 站点(通过每日 cron)。

wp该组内的命令pushd-popdWP-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

相关内容