Merge pull request 'zsh-Pflicht im Installer' (#6) from fix/instal-zsh-pflicht into main

zsh-Pflicht im Installer
This commit was merged in pull request #6.
This commit is contained in:
mm committed 2026-11-02 18:07:21 +00:00
commit d977a9f856
5 files changed
+110 -13

No files matched your search

+11
View File
@@ -4,6 +4,17 @@ Format: Datum — was — warum. Die CI beginnt versioniert am 2026-10-23; davor
sie verstreut (Marke in `brand/`, Dokument-CSS im Open-WebUI-Skill) und wurde nicht
versioniert.
## 1.3.1 — 2026-11-02
- **zsh ist Pflicht, und das Skript sagt es jetzt auch.** `shell/install.sh` installiert zsh
bei Bedarf selbst (apt-get, dnf, pacman, zypper, apk) und schreibt das in den Kopf und in
die Ausgabe. Geht es nicht — kein Paketmanager oder `sudo` ohne Passwort — bricht der
Shell-Teil **vor dem ersten Schreibzugriff** ab, nennt den genauen Befehl und endet mit
Exit 1; `~/.zshrc` bleibt unangetastet, statt einen wirkungslosen Prompt-Eintrag zu
hinterlassen. Ein `chsh`-Fehlschlag wird gemeldet statt verschluckt, und die Abschlusszeile
nennt Exit-Status und naechsten Schritt.
- `install_zsh` meldet Erfolg nur noch, wenn `zsh` danach wirklich im `PATH` liegt.
## 1.3.0 — 2026-11-02
- **Die CI reicht bis in die Shell.** `shell/prompt.zsh` rendert einen zweizeiligen Prompt
+7 -1
View File
@@ -57,6 +57,12 @@ Prompt, Terminal-Palette, ein Skript für beides.
![Der Prompt in einem Terminal mit CI-Palette](assets/vorschau-shell.png)
> **zsh ist Pflicht.** Der Prompt ist ein zsh-Modul; in bash passiert nichts. Das Skript
> installiert zsh selbst — `apt-get`, `dnf`, `pacman`, `zypper` oder `apk`, je nach System.
> Fehlt der Paketmanager oder verlangt `sudo` ein Passwort, **bricht der Shell-Teil ab**, nennt
> den genauen Befehl und lässt `~/.zshrc` unangetastet: lieber kein Prompt als ein stummer.
> Danach einmal neu einloggen (oder `exec zsh`), sonst greift die Login-Shell-Änderung nicht.
```bash
curl -fsSLo install.sh https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell/install.sh
bash install.sh --dry-run # zeigt, was passieren würde
@@ -65,7 +71,7 @@ bash install.sh # führt es aus
Kein Token nötig — das Repo ist öffentlich lesbar. Das Skript ist idempotent, sichert jede
Datei nach `.vor-kalina-ci-<stempel>` und erkennt **foot**, **qterminal**, **xfce4-terminal**
und **xterm**; zsh installiert es über den vorhandenen Paketmanager. Schalter:
und **xterm**. Schalter:
`--shell-only`, `--terminal-only`, `--no-chsh`. Details und die Fallen beim Ausrollen stehen in
[`shell/README.md`](shell/README.md).
+6 -1
View File
@@ -2,7 +2,7 @@
name: kalina-ci
description: Use when a PDF, page or slide must carry the KALINA corporate identity. One CSS, one CLI, one source.
metadata:
version: "1.3.0"
version: "1.3.1"
stand: "2026-11-02"
---
@@ -164,6 +164,11 @@ curl -fsSLo install.sh https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell/
bash install.sh --dry-run && bash install.sh
```
**zsh ist Pflicht** — der Prompt ist ein zsh-Modul. Das Skript installiert zsh bei Bedarf
selbst; kann es das nicht (kein Paketmanager, `sudo` ohne Passwort), bricht der Shell-Teil mit
Exit 1 ab und nennt den Befehl, statt einen wirkungslosen `~/.zshrc`-Eintrag zu hinterlassen.
Danach `exec zsh` oder neu einloggen, sonst greift die Login-Shell nicht.
Das Skript ist idempotent, sichert jede Datei und erkennt foot, qterminal, xfce4-terminal
sowie xterm. Die Paletten sind gemessen, nicht geraten — die drei Fallen (qtermwidget6
kennt kein Benutzerverzeichnis, xfconf überstimmt `terminalrc`, foot will `[colors-dark]`)
+26 -1
View File
@@ -19,6 +19,31 @@ kein oh-my-zsh und kein powerlevel10k noetig.
| Steel | `#3A4250` | Linien |
| Muted | `#8A94A2` | Hostname |
## zsh ist Pflicht
Der Prompt ist zsh-Syntax in `~/.zshrc`. In bash, fish oder sh passiert nichts — auch dann
nicht, wenn die Datei korrekt geschrieben wurde. Deshalb:
1. **Fehlt zsh, installiert `install.sh` ihn selbst** — `apt-get`, `dnf`, `pacman`, `zypper`
oder `apk`, je nach System. Der Versuch steht als erste Zeile im Shell-Teil.
2. **Geht das nicht** (kein bekannter Paketmanager, oder `sudo` verlangt ein Passwort ohne
`-n`), bricht der Shell-Teil **vor** dem ersten Schreibzugriff ab, nennt den genauen Befehl
und endet mit Exit 1. `~/.zshrc` bleibt dann unangetastet — ein Eintrag dort waere in bash
ohnehin wirkungslos.
3. **Login-Shell**: `chsh -s <zsh>` laeuft am Ende (abschaltbar mit `--no-chsh`). Wirksam wird
es erst in der naechsten Sitzung: `exec zsh` fuer sofort, sonst neu einloggen.
Wer zsh von Hand nachzieht:
```sh
sudo apt-get install -y zsh # Debian/Ubuntu
sudo dnf install -y zsh # Fedora
sudo pacman -S --needed zsh # Arch
sudo zypper install -y zsh # openSUSE
sudo apk add zsh # Alpine
bash install.sh # danach erneut
```
## Installation auf einer neuen Maschine
```sh
@@ -38,7 +63,7 @@ und laesst sich in Teilen fahren:
| `--dry-run` | nichts schreiben, nur anzeigen |
| `--shell-only` | nur zsh + Prompt |
| `--terminal-only` | nur Terminal-Palette |
| `--no-chsh` | Login-Shell nicht umstellen |
| `--no-chsh` | Login-Shell nicht umstellen (Prompt bleibt, bis du `zsh` startest) |
Erkannt und eingerichtet werden: **foot** (`~/.config/foot/foot.ini`,
`[colors-dark]`), **qterminal** (`~/.local/share/qterminal-ci/…/KalinaCI.colorscheme`
+60 -10
View File
@@ -10,6 +10,12 @@
# ./install.sh --terminal-only # nur Terminal-Palette
# ./install.sh --no-chsh # Login-Shell nicht anfassen
#
# zsh ist Pflicht: der Prompt ist ein zsh-Modul, in bash wirkt er nicht. Fehlt zsh,
# installiert dieses Skript ihn selbst (apt-get, dnf, pacman, zypper, apk). Geht das
# nicht — kein Paketmanager oder sudo ohne Passwort — bricht der Shell-Teil ab und
# nennt den genauen Befehl zum Nachholen. Ein halb eingerichtetes ~/.zshrc hilft
# niemandem, deshalb lieber kein Prompt als ein stummer.
#
# Grundsaetze: jede Datei wird vorher gesichert (.vor-kalina-ci-<stempel>),
# jeder Block ist an einem Marker erkennbar und wird nicht doppelt geschrieben,
# jede veraenderte Datei wird anschliessend mit dem passenden Pruefer getestet.
@@ -26,6 +32,7 @@ SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RAW="${KALINA_CI_RAW:-https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell}"
DRY=0; DO_SHELL=1; DO_TERM=1; DO_CHSH=1
ZSH_OK=0 # 1 = zsh vorhanden oder installiert; 0 = Prompt kann nicht greifen
for arg in "$@"; do
case "$arg" in
--dry-run) DRY=1 ;;
@@ -58,6 +65,11 @@ fi
install_zsh() {
command -v zsh >/dev/null && { ok "zsh vorhanden: $(zsh --version)"; return 0; }
if [ "$DRY" = 1 ]; then
say " zsh fehlt — ein echter Lauf wuerde ihn jetzt installieren (ohne zsh kein Prompt)."
else
say " zsh fehlt — wird jetzt installiert (ohne zsh kein Prompt)."
fi
local pm=""
for c in apt-get dnf pacman zypper apk; do command -v "$c" >/dev/null && pm="$c" && break; done
[ -n "$pm" ] || { warn "kein bekannter Paketmanager — zsh bitte von Hand installieren"; return 1; }
@@ -76,10 +88,15 @@ install_zsh() {
apt-get) run $SUDO env DEBIAN_FRONTEND=noninteractive apt-get install -y zsh ;;
dnf) run $SUDO dnf install -y zsh ;;
pacman) run $SUDO pacman -S --needed --noconfirm zsh ;;
zypper) run $SUDO zypper --non-interactive install zsh ;;
apk) run $SUDO apk add zsh ;;
zypper) $SUDO zypper --non-interactive install zsh ;;
apk) $SUDO apk add zsh ;;
esac
command -v zsh >/dev/null && ok "zsh installiert: $(zsh --version)" || warn "zsh weiterhin nicht auffindbar"
if command -v zsh >/dev/null; then
ok "zsh installiert: $(zsh --version)"
return 0
fi
warn "zsh ist nach der Installation nicht auffindbar — PATH pruefen"
return 1
}
# Block mit Markern an eine Datei anhaengen (nicht doppelt)
@@ -101,7 +118,17 @@ append_block() {
# ------------------------------------------------------------------ Shell
do_shell() {
step "Shell (zsh + Kalina-CI-Prompt)"
install_zsh || true
# Ohne zsh gibt es keinen Prompt: das Modul ist zsh-Syntax in ~/.zshrc. Wer in bash
# sitzt, sieht davon nichts — also erst zsh, dann alles andere.
if ! command -v zsh >/dev/null && [ "$DRY" = 1 ]; then
install_zsh || true
warn "Trockenlauf: ein echter Lauf wuerde zsh zuerst installieren, sonst gaebe es keinen Prompt"
elif ! install_zsh; then
warn "Shell-Teil abgebrochen — ohne zsh wirkt der Prompt nicht (kein ~/.zshrc-Eintrag geschrieben)."
warn "zsh nachholen (Befehl oben), dann dieses Skript erneut starten."
return 1
fi
run mkdir -p "$CONF_DIR"
if [ -f "$SRC_DIR/prompt.zsh" ]; then
@@ -170,13 +197,26 @@ RC
fi
# Login-Shell
local cur; cur="$(getent passwd "$(id -un)" | cut -d: -f7)"
if [ "$cur" = "$(command -v zsh 2>/dev/null)" ]; then
local cur zshbin; cur="$(getent passwd "$(id -un)" | cut -d: -f7)"
zshbin="$(command -v zsh 2>/dev/null)"
if [ -z "$zshbin" ]; then
warn "zsh nicht gefunden — Login-Shell bleibt $cur, Prompt erscheint nicht"
return 0
fi
ZSH_OK=1
if [ "$cur" = "$zshbin" ]; then
ok "Login-Shell ist bereits zsh"
elif [ "$DO_CHSH" = 0 ]; then
warn "Login-Shell bleibt $cur (--no-chsh); Start mit 'exec zsh' oder 'chsh -s $(command -v zsh)'"
warn "Login-Shell bleibt $cur (--no-chsh). Bis du zsh startest, siehst du den Prompt nicht:"
say " exec zsh # nur diese Sitzung"
say " chsh -s $zshbin # dauerhaft"
else
run $SUDO chsh -s "$(command -v zsh)" "$(id -un)" && ok "Login-Shell auf zsh gestellt (greift beim naechsten Login)"
if run $SUDO chsh -s "$zshbin" "$(id -un)"; then
ok "Login-Shell auf zsh gestellt — greift beim naechsten Login (nicht in dieser Sitzung)"
else
warn "chsh fehlgeschlagen; Login-Shell bleibt $cur. Von Hand: chsh -s $zshbin"
warn "Sofort testen: exec zsh"
fi
fi
}
@@ -446,10 +486,20 @@ XRES
say "Kalina CI — Installation auf $(hostname), Ziel $HOME"
[ "$DRY" = 1 ] && say "(Probelauf: es wird nichts geschrieben)"
[ "$DO_SHELL" = 1 ] && do_shell
RC=0
[ "$DO_SHELL" = 1 ] && { do_shell || RC=1; }
[ "$DO_TERM" = 1 ] && do_terminal
say ""
step "Fertig"
say " Prompt pruefen: zsh -i (oder neue Terminal-Sitzung)"
if [ "$RC" = 0 ] && [ "$ZSH_OK" = 1 ]; then
ok "neu starten: exec zsh — oder einmal neu einloggen (Login-Shell greift erst dann)"
elif [ "$RC" = 0 ]; then
warn "ohne zsh kein Prompt — im echten Lauf bricht der Shell-Teil hier ab"
else
warn "mit Fehlern beendet (Exit 1) — oben steht, was fehlt; erneut starten, sobald es da ist"
fi
say " Prompt pruefen: zsh -i"
say " Abschalten: KALINA_CI_PROMPT=0 zsh -i"
say " Palette pruefen: Terminal neu starten; nach environment.d-Aenderung einmal neu anmelden"
exit "$RC"