TIL: Sub-Shell-Trick zum Bloggen mit Hugo

Da ich ja nun offensichtlich wieder öfter blogge, habe ich endlich mal einen nervigen Bug in meinem Blogging-Workflow behoben.

Ich nutze Hugo, um diese Site zu generieren. In meiner .zshrc gibt es eine Funktion, welche den meinen Editor startet, den Browser mit der Vorschau öffnet und Hugo im Hintergrund laufen lässt. So kann ich direkt loslegen und sehe die Änderungen im Browser, während ich schreibe.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
blog () {
    if [[ ! -d "$BLOG_HOME" ]]; then
        echo "Blog directory not found: $BLOG_HOME"
        exit 1
    fi

    cd "$BLOG_HOME"
    code "$BLOG_HOME"
    open http://localhost:1313/
    make serve
}

make serve ist der Watcher-Prozess von Hugo, welcher bei Datei-Änderungen die Seite neu rendert und im Browser neu lädt.

Das nervige Problem: open öffnet den Browser, unter der URL ist aber in diesem Moment noch nichts zu holen, weil der Hugo-Watcher noch nicht läuft:

Unable to connect

Firefox can’t establish a connection to the server at localhost:1313.

Die Lösung ist trivial: eine Sub-Shell im Hintergrund starten, welche erst mal eine Sekunde wartet, bevor das open-Command aufgerufen wird:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
blog () {
    if [[ ! -d "$BLOG_ROOT" ]]; then
        echo "Blog directory not found: $BLOG_ROOT"
        exit 1
    fi

    cd "$BLOG_ROOT"
    code --goto "$TIL_FILE":2:14 "$TIL_BLOG_ROOT"
    ( sleep 1 && open http://localhost:1313/ ) &
    make serve
}

🙌

BTW, ich habe noch eine zweite Funktion, blog-til, welche für diese TIL-Posts gleich die richtige Datei anlegt und im Editor den Cursor an die passende Stelle setzt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    blog-til () {
        if [[ ! -d "$TIL_BLOG_ROOT" ]]; then
            echo "Blog directory not found: $TIL_BLOG_ROOT"
            exit 1
        fi

        cd "$TIL_BLOG_ROOT"

        TIL_DATE=$(date +%Y-%m-%d)
        TIL_DIR=content/blog/$(date +%Y)/$TIL_DATE-til
        TIL_FILE=$TIL_DIR/index.md

        mkdir -p "$TIL_DIR"

        if [[ ! -f "$TIL_FILE" ]]; then
            hugo new "$TIL_FILE" -k til
        fi

        code --goto "$TIL_FILE":2:14 "$TIL_BLOG_ROOT"
        ( sleep 1 && open http://localhost:1313/ ) &
        make serve
    }

Du findest diesen Artikel hilfreich?

Folge Marcus auf Mastodon

Auch über Fragen und Anmerkungen freue ich mich! Am einfachsten sendest du diese direkt an meinen Mastodon-Account.