Leiten Sie alle Codezeilen in einer einzigen Zeile in dieselbe Datei um.

Leiten Sie alle Codezeilen in einer einzigen Zeile in dieselbe Datei um.

Ich habe den folgenden Befehlssatz verwendet, um alle meine WordPress-Sites in meiner CentOs-Shared-Hosting-Partition auf der Plattform meines Hosting-Anbieters zu aktualisieren (über täglichen Cron).

Die wpBefehle innerhalb des pushd-popdSets sind von derWP-CLIProgramm, eine Bash-Erweiterung, die für verschiedene Aktionen auf Shell-Ebene auf WordPress-Websites verwendet wird.

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

Das Verzeichnis public_htmlist das Verzeichnis, in dem sich alle Website-Verzeichnisse befinden (jede Website hat normalerweise eine Datenbank und ein Hauptdateiverzeichnis).

Da es public_htmleinige Verzeichnisse gibtWelche nicht sindWenn es sich um WordPress-Websiteverzeichnisse handelt, gibt WP-CLI diesbezüglich Fehler zurück.

Um diese Fehler zu vermeiden, könnte ich vermutlich Folgendes tun:

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

Gibt es statt des viermaligen (oder häufigeren) Schreibens 2>myErrors.txteine Möglichkeit, sicherzustellen, dass alle Fehler aller Befehle in derselben Datei in einer Zeile aufgeführt werden?

Antwort1

Der > fileOperator öffnet die Datei filezum Schreiben, kürzt sie aber zunächst. Das heißt, jedes neue > filebewirkt, dass der Inhalt der Datei ersetzt wird.

Wenn Sie möchten, myErrors.txtdass die Datei die Fehler aller Befehle enthält, müssen Sie die Datei entweder nur einmal öffnen oder >das erste Mal und >>die anderen Male verwenden (wodurch die Datei inAnhängenModus).

Wenn es Ihnen nichts ausmacht, dass die pushd/ popd-Fehler auch in die Protokolldatei gelangen, können Sie hier die gesamte forSchleife umleiten:

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

Oder Sie könnten die Protokolldatei auf einem FD über beispielsweise 2, 3 öffnen und für jeden Befehl oder jede Befehlsgruppe, die Sie zur Protokolldatei umleiten möchten, Folgendes verwenden 2>&3(oder um Befehle nicht mit FDs zu verunreinigen, die sie nicht benötigen):2>&3 3>&-

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

Antwort2

Sie können geschweifte Klammern verwenden, umGruppeein Block und leitet die gesamte Ausgabe um:

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

verwandte Informationen