Centos

在一行中將所有程式碼行重定向到同一個文件

  • May 29, 2018

我有以下命令集用於更新我的託管服務提供商平台上我的 CentOs 共享託管分區中的所有 WordPress 站點(通過每日 cron)。

集合中的wp命令屬於WP-CLI程序,它是一個 Bash 擴展,用於 WordPress 網站上的各種 shell 級操作。pushd-popd

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四次(或更多),有沒有辦法確保所有錯誤,從每個命令,都將在一行中轉到同一個文件?

> 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

引用自:https://unix.stackexchange.com/questions/446708