Kapitel 5 von 15nullos.de

Die Befehle

Kurz, kürzer, nullos. Was man ständig braucht, hat einen Buchstaben.

Die Idee

c kopierenm verschiebend löschenl auflisten
g Text suchenf Dateien findene Editorh Hilfe

Tab weiß alles

Jedes Werkzeug bringt eine kleine Datei spec mit: Name, Langname, alte Namen, Beschreibung, Optionen, Art der Argumente (Pfad, Ordner, Prozess …). Daraus holt sich die Shell die Tab-Vervollständigung, h die Hilfe – und diese Seite die Karten unten. Neues Werkzeug = sofort überall dabei.

h            alle Werkzeuge
h cp         Hilfe zu c (alter Name geht auch)
h -s tar     suchen – findet arc

Alle Werkzeuge

384 Werkzeuge gebaut, 7 gerade in Arbeit, 409 im Katalog geplant. fertig baut, Test grün (laut Abgleich docs/stand.md oder README) · teilweise · in Arbeit · gebaut da, Status noch nicht gemeldet. Die Tests laufen auf dem Mac. Auf nullos selbst landen rund 270 davon in /bin (gebaut mit der nullos-libc, make nullos-tools) – einzeln durchgetestet ist dort noch nicht jedes. Hier stehen nur die gebauten – alle geplanten zeigt die Werkzeug-Bibliothek.

a2l ac acc acl ad adb af alt ap arc asa asc asm at atm aud av aw bak bas bdf bl bld bnr bo bom bp bri brn bsp bt bta btr buf bw c ca cal cap cb cch cfe cfg cfl cg chm chr ck clc clk cm cn cns cnv col cor cpu cr crs crt cry cs ct ctr cu cx cxr d dbf dbg dcl dco dd dfr dh dhs di dl dlg dm dmg dmm dns doc dsk dsp dt dtc dtr dv dvf e efs ej elf en eol err eth ev evv exp f fa fca fct fe ff fm fmt fnt fo fs ftr fw fwa g gc gk gp grp gt gty h hd he hl hn hng hs htp hw hx i2c ic id idt imc ind ini ins io ip ipc ipo isv iv js k kb kg kr krb kx l la lbl lc ld ldc ldd lex lgn lh lib lic lip lk ln loc log lop lp lpa lpd lpf lpm lpt lr lt lu lv lw m m4 ma mck md mdn mem mf mid mim mk mkd mmc mn mo mod mp mrs msg mst mx mxr nb nbd nc net nf nfs ng nh ni nl nmo ns nss nt ntf nv nw obj ocp of off op opt osa p part pc pers pg pgn ph pi pk pkb pkc pli pnt pol pom ppp pr prf prt prv psw pt ptx pv pwg pwr px py ql qt ra rcs rcv rd rdp rds rec res rf rk rmd rn rnd rp rpc rs rst rsv rsy rsz rt rtc rv s say sch scn scp scr sct sd sen ser sf sgn sh shr si sip sk sl sld smb smt sn snp so sp spc spi spl sr ssd ssh ssl st sto str sts stv sty su sue sv swp swr sy sys sz t tag te ti tl tm tmp to tp tpm tr tra trc tri trm trs tru ts tso tst tty tun tyc tz u uc uif un up upd usr uu vc vfy vis vl vm vt wa wdg wds wf wg wh who wip wis wl wp wsa wsu xa xat xc yac zp

Kernsatz – Dateien

c copy fertig

Dateien und Ordner kopieren

c [-r -f -v -n] QUELLE... ZIEL

statt cp

mehr
-r
rekursiv (Ordner mitsamt Inhalt)
-f
vorhandene Ziele überschreiben
-v
jede Kopie anzeigen
-n
nur zeigen, was kopiert würde

c QUELLE ZIEL kopiert eine Datei, c -r ORDNER ZIEL einen ganzen Ordner, c A B C ORDNER/ mehrere in einen Ordner.

ersetzt: cp, copy, xcopy, robocopy, ditto

Status: fertig (Mac)

d delete fertig

Dateien und Ordner löschen

d [-r -f -v -n] DATEI...

statt rm delete erase del unlink

mehr
-r
rekursiv (Ordner mitsamt Inhalt)
-f
fehlende Dateien ohne Fehler übergehen
-v
jede gelöschte Datei anzeigen
-n
nur zeigen, was gelöscht würde

d DATEI... löscht Dateien, d -r ORDNER einen ganzen Ordner mitsamt Inhalt.

ersetzt: rm, del, erase, unlink, shred

Status: fertig (Mac)

f find fertig

Dateien und Ordner nach Namen finden

f [-t d|f -s +1M -a TAGE -x BEFEHL -0] MUSTER [ORDNER]

statt fd locate

mehr
-t
Art: d Ordner, f Datei
-s
Größe: +1M mindestens, -10k höchstens
-a
nur Treffer, die in den letzten N Tagen geändert wurden
-x
Befehl je Treffer ausführen ({} = Pfad)
-0
Ausgabe durch NUL getrennt

f MUSTER [ORDNER] sucht ab ORDNER (Standard .) rekursiv alle Namen, die auf das Muster passen (*, ?, [abc], [a-z], [!x]).

ersetzt: find, where /r, locate, fd, forfiles

Status: fertig (Mac)

l list fertig

Ordner auflisten (sortiert, Spalten am Terminal)

l [-a -l -r -t -s -d] [PFAD...]

statt ls dir tree

mehr
-a
auch versteckte Einträge (Name beginnt mit Punkt)
-l
lang: Art, Größe, Datum, Name
-r
rekursiv (Unterordner mit auflisten)
-t
Baumansicht (ersetzt tree)
-s
nach Größe sortieren (größte zuerst)
-d
nach Datum sortieren (neueste zuerst)

l zeigt den aktuellen Ordner, l PFAD... andere Ordner oder Dateien. Ordner enden mit /. Am Terminal in Spalten (80 Zeichen breit), sonst eine Zeile je Eintrag.

ersetzt: ls, dir, tree

Status: fertig (Mac)

ln link fertig

Verknüpfungen anlegen (hart, oder symbolisch mit -s)

ln [-s -f -v] ZIEL [LINKNAME] | ln [-s -f -v] ZIEL... ORDNER

statt ln mklink

mehr
-s
symbolischer Link statt hartem Link
-f
vorhandenen Link/Datei ersetzen
-v
jeden Link anzeigen

ln ZIEL LINKNAME legt einen harten Link an, ln -s ZIEL LINKNAME einen symbolischen. ln ZIEL... ORDNER/ legt die Links in einen Ordner. -f ersetzt einen vorhandenen Link oder eine Datei (nie einen Ordner), -v zeigt, was entsteht. ln ZIEL allein legt einen Link gleichen Namens im aktuellen Ordner an.

ersetzt: ln, mklink, link

Status: fertig (Mac)

m move fertig

Dateien und Ordner verschieben oder umbenennen

m [-f -v -n] QUELLE... ZIEL

statt mv move

mehr
-f
vorhandene Ziele überschreiben
-v
jedes Verschieben anzeigen
-n
nur zeigen, was verschoben würde

m QUELLE ZIEL benennt um oder verschiebt, m A B C ORDNER/ verschiebt mehrere in einen Ordner.

ersetzt: mv, move

Status: fertig (Mac)

md makedir fertig

Ordner anlegen (Elternordner immer mit)

md [-v] ORDNER...

statt mkdir md

mehr
-v
jeden angelegten Ordner anzeigen

md ORDNER... legt Ordner an – Elternordner immer mit (kein -p nötig). Ein schon vorhandener Ordner ist kein Fehler. -v zeigt jeden neu angelegten Ordner.

ersetzt: mkdir, md

Status: fertig (Mac)

rd removedir fertig

Leere Ordner entfernen

rd [-p -v] ORDNER...

statt rmdir rd

mehr
-p
leere Elternordner mit entfernen
-v
jeden entfernten Ordner anzeigen

rd ORDNER... entfernt nur leere Ordner. -p nimmt auch leere Elternordner mit (rd -p a/b/c entfernt c, dann b, dann a, solange sie leer sind; sobald einer bleiben muss, hört es still auf). -v zeigt, was entfernt wurde.

ersetzt: rmdir, rd

Status: fertig (Mac)

rn rename fertig

Dateien und Ordner umbenennen (nur der Name, im selben Ordner)

rn [-n -v] ALT NEU | rn [-n -v] -e 's/x/y/' DATEI...

statt rename ren

mehr
-e
Stapelmodus: in allen Namen den festen Text x durch y ersetzen
-n
nur zeigen, was umbenannt würde
-v
jede Umbenennung anzeigen

rn ALT NEU benennt um, nur der Name im selben Ordner (rn ordner/a.txt b.txt ergibt ordner/b.txt). Zum Verschieben gibt es m. Überschreibt nie: existiert NEU schon, bricht rn ab.

ersetzt: rename, ren, mmv

Status: fertig (Mac)

st stat fertig

Art (mit Inhaltserkennung), Größe, Rechte und Zeiten einer Datei zeigen

st [-t] DATEI...

statt stat file

mehr
-t
nur die Art in einer Zeile (wie file)

st DATEI... zeigt Name, Art, Größe, Rechte (rwxr-xr-x (755)), Anzahl harter Links und die drei Zeiten (geändert, benutzt, Status). Die Art erkennt st am Inhalt (die ersten 512 Bytes), wie file: Text (ASCII/UTF-8), Skript (#!), ELF, Mach-O, PE, PNG, JPEG, GIF, WebP, WAV, PDF, ZIP, gzip, bzip2, xz, 7z, tar, SQLite, sonst „Daten (binär)“; dazu Ordner, Link (mit Ziel), leere Datei. -t gibt nur eine Zeile DATEI: Art aus.

ersetzt: stat, file, attrib (Anzeige)

Status: fertig (Mac)

sz size fertig

Platzverbrauch von Ordnern und Dateien (Bytes)

sz [-s -a -h -k] [-d TIEFE] [PFAD...]

statt du ncdu

mehr
-s
nur die Summe je Argument
-a
auch einzelne Dateien auflisten
-h
gut lesbare Einheiten (K, M, G)
-k
in KiB (aufgerundet)
-d
nur bis zu dieser Ordnertiefe anzeigen (Option mit Zahl)

sz ORDNER zeigt jeden Unterordner mit seiner Größe, -s nur die Summe, -a auch Dateien, -h lesbar, -k KiB, -d 1 nur bis Tiefe 1. Zählt die Dateigrößen (Bytes), nicht belegte Blöcke; harte Links werden doppelt gezählt.

ersetzt: du, dir /s, ncdu

Status: fertig (Mac)

t touch fertig

Leere Datei anlegen oder Änderungszeit auf jetzt setzen

t [-c -v] DATEI...

statt touch

mehr
-c
nichts anlegen, wenn die Datei fehlt
-v
anzeigen, was passiert ist

t DATEI... legt fehlende Dateien leer an und setzt bei vorhandenen die Änderungszeit auf jetzt. -c legt nichts an, -v zeigt, was geschah.

ersetzt: touch, copy /b +,,

Status: fertig (Mac)

Kernsatz – Text

aw awk fertig

Text zeilenweise mit Mustern und Aktionen verarbeiten (Sprache awk)

aw [-F FS] [-v VAR=WERT]... [-f DATEI]... ['PROGRAMM'] [DATEI | VAR=WERT]...

statt awk gawk mawk nawk

mehr
-F
Feldtrenner FS (ein Zeichen, " " = Leerraum, sonst Muster; -Ft = Tab)
-v
Variable vor BEGIN setzen (VAR=WERT, Fluchtfolgen wie in "...")
-f
Programm aus Datei lesen (mehrfach erlaubt, - = Eingabe)

aw 'PROGRAMM' [DATEI...] liest Text Zeile für Zeile, zerlegt jede Zeile in Felder ($1, $2, …) und führt für jedes passende Muster die Aktion aus. Langname awk; ersetzt awk, gawk, mawk, nawk.

ersetzt: awk, gawk, mawk

Status: fertig (Mac)

cn count fertig

Zeilen, Wörter und Bytes zählen

cn [-l -w -c -m] [DATEI...]

statt wc

mehr
-l
Zeilen
-w
Wörter
-c
Bytes
-m
Zeichen (UTF-8)

cn DATEI gibt Zeilen Wörter Bytes NAME aus. Mit -l -w -c -m nur die gewählten Zahlen (immer in der Reihenfolge Zeilen, Wörter, Zeichen, Bytes). Mehrere Dateien: eine Zeile je Datei und am Ende gesamt. Ohne Datei wird die Standardeingabe gezählt, dann ohne Namen.

ersetzt: wc, measure

Status: fertig (Mac)

ct cut fertig

Felder und Zeichen schneiden, Dateien kleben, verbinden, als Tabelle

ct -f LISTE|-c LISTE [-d Z -s] [DATEI...] | ct -p [-d Z] DATEI... | ct -j [-f N -d Z] A B | ct -t [-d Z] [DATEI...]

statt cut paste join column

mehr
-f
Felder wählen (1,3 oder 2-4); bei -j die Schlüsselspalte
-c
Zeichen wählen (1-5, UTF-8)
-d
Trenner (Standard Tabulator; bei -j und -t Leerraum)
-s
Zeilen ohne Trenner weglassen
-p
Dateien nebeneinander kleben (paste)
-j
zwei Dateien über ein Feld verbinden (join)
-t
als ausgerichtete Tabelle ausgeben (column -t)

- ct -f 1,3 -d , DATEI Felder (2-4, 3- erlaubt), ct -c 1-5 DATEI Zeichen (UTF-8-sicher) - ct -p A B Dateien zeilenweise nebeneinander (Tabulator oder -d) - ct -j A B verbindet über Feld 1 (-f N anderes Feld); die Dateien müssen nicht sortiert sein - ct -t [DATEI] richtet Spalten aus (Trenner Leerraum oder -d)

ersetzt: cut, paste, join, column

Status: fertig (Mac)

di diff fertig

Dateien und Ordner vergleichen

di [-r -q -b -c] ALT NEU

statt diff cmp comm fc

mehr
-r
Ordner rekursiv vergleichen
-q
nur sagen, ob verschieden
-b
Bytes vergleichen, erstes abweichendes Byte nennen (cmp)
-c
drei Spalten wie comm (nur ALT, nur NEU, beide; sortierte Eingaben)
-u
Unified-Ausgabe (ist Standard, nur für Skripte)

di ALT NEU zeigt die Unterschiede zweier Textdateien im Unified-Format (3 Zeilen Umgebung); patch kann die Ausgabe anwenden.

ersetzt: diff, cmp, comm, fc

Status: fertig (Mac)

g grep fertig

Text in Dateien oder Eingabe suchen (reguläre Ausdrücke, POSIX erweitert)

g [-i -v -n -c -l -r -w -F -q] MUSTER [DATEI...]

statt grep egrep fgrep findstr rg

mehr
-i
Groß-/Kleinschreibung ignorieren
-v
nur nicht passende Zeilen
-n
Zeilennummern voranstellen
-c
nur Anzahl passender Zeilen
-l
nur Namen der Dateien mit Treffer
-r
Ordner rekursiv durchsuchen
-w
nur ganze Wörter
-F
Muster ist fester Text, kein Ausdruck
-q
still, nur Rückgabewert

g MUSTER [DATEI...] zeigt Zeilen, die zum Muster passen; ohne Datei wird die Eingabe (stdin) gelesen, g -r MUSTER [ORDNER] durchsucht Ordner rekursiv (ohne Angabe: .).

ersetzt: grep, egrep, fgrep, findstr, rg, Select-String

Status: fertig (Mac)

hd head fertig

Anfang einer Datei zeigen

hd [-n ZEILEN | -c BYTES] [DATEI...]

statt head

mehr
-n
Anzahl Zeilen (Standard 10)
-c
Anzahl Bytes statt Zeilen

hd DATEI zeigt die ersten 10 Zeilen, hd -n 3 DATEI die ersten 3, hd -c 100 DATEI die ersten 100 Bytes. Ohne Datei (oder mit -) wird die Standardeingabe gelesen; bei mehreren Dateien steht vor jeder eine Kopfzeile ==> NAME <==.

ersetzt: head

Status: fertig (Mac)

hx hex fertig

Bytes als Hex zeigen (und zurückwandeln)

hx [-s OFFSET] [-n LÄNGE] [-o | -c | -r] [DATEI]

statt xxd hexdump od

mehr
-s
bei diesem Byte-Offset beginnen
-n
nur so viele Bytes
-o
Oktal statt Hex
-c
als C-Array ausgeben
-r
Hex-Zeilen zurück in Bytes wandeln

hx datei zeigt 16 Bytes je Zeile: Offset, Hex, Text (wie xxd). hx -s 16 -n 32 datei einen Ausschnitt, hx -o Oktal, hx -c datei als C-Array (unsigned char datei_c[] + _len), hx -r wandelt die Hex-Zeilen zurück in die Bytes (hx d | hx -r ergibt d wieder).

ersetzt: xxd, hexdump, od, format-hex

Status: fertig (Mac)

pr print fertig

Text ausgeben: einfach, formatiert, wiederholt oder als Zahlenfolge

pr [-n -e] TEXT... | pr -f FORMAT ARG... | pr -r N TEXT... | pr -s ERSTE LETZTE [SCHRITT]

statt echo printf yes seq

mehr
-n
keinen Zeilenumbruch anhängen
-e
Fluchtfolgen auswerten (\n \t \\ \xHH \0NNN \c)
-f
FORMAT wie printf (%s %d %u %x %o %c %f %e %g %%)
-r
Text N-mal wiederholen (0 = endlos, wie yes; ohne Text "y")
-s
Zahlenfolge ERSTE bis LETZTE, optional SCHRITT (wie seq)

Vier Werkzeuge in einem:

ersetzt: echo, printf, yes, seq

Status: fertig (Mac)

pt patch teilweise

Änderungen aus einer Unterschiedsdatei (diff -u) anwenden

pt [-R -n -v] [-p N] [-i PATCHDATEI] [DATEI]

statt patch

mehr
-R
Änderungen rückgängig machen
-n
nur prüfen, nichts schreiben
-v
jede Änderung anzeigen
-p
N Pfadteile vom Dateinamen entfernen (mit Wert)
-i
Patchdatei statt Standardeingabe (mit Wert)

pt -i PATCH (oder pt < PATCH) wendet ein diff -u an; -p1 entfernt einen Pfadteil, -R macht rückgängig, -n prüft nur, -v zeigt jede Änderung. Mit pt -i PATCH DATEI wird die Datei erzwungen. Verschobene Stellen werden gefunden (Suche um die Sollzeile); passt eine Änderung nicht, wird die ganze Datei nicht verändert (kein .rej). Neue/gelöschte Dateien (auch diff -N) und „kein Zeilenende am Ende“ gehen. Nicht dabei: Fuzz (abweichender Kontext), Kontext-/Normal-diff-Formate, Backup (-b).

ersetzt: patch

Status: teilweise

sh show fertig

Dateien (oder Eingabe) hintereinander zeigen

sh [-n -r] [DATEI...]

statt cat type tac

mehr
-n
Zeilen nummerieren
-r
Zeilen rückwärts (tac)

sh DATEI... gibt Dateien hintereinander aus, ohne Datei (oder mit -) die Standardeingabe. -n nummeriert die Zeilen, -r gibt die Zeilen rückwärts aus (wie tac; die ganze Datei wird dafür in den Speicher gelesen).

ersetzt: cat, type, tac

Status: fertig (Mac)

so sort fertig

Zeilen sortieren (auch Dateien größer als der Speicher)

so [-r -n -h -u -f -c] [-k N] [-t X] [-S KB] [DATEI...]

statt sort

mehr
-r
umgekehrte Reihenfolge
-n
Zahlen nach Wert (statt Text)
-h
Größen wie 1K 2M 3G nach Wert
-k
ab Feld N (ab 1) bis Zeilenende sortieren
-t
Trennzeichen der Felder (sonst Leerzeichen/Tabs)
-u
gleiche Zeilen (nach Schlüssel) nur einmal
-f
Groß-/Kleinschreibung ignorieren
-c
nur prüfen, ob sortiert (Fehler = Ausgabe, Rückgabe 1)
-S
Speicher je Lauf in KB (Standard 1024); darüber hinaus über Zwischendateien in $TMPDIR oder /tmp

so DATEI sortiert Zeilen, so -n nach Zahlen, so -h nach Größen (1K, 2M, 3G), so -k 2 -t : nach Feld 2.

ersetzt: sort

Status: fertig (Mac)

sr substitute fertig

Text ersetzen und umformen (Ersetzen, Löschen, Einfügen; Muster POSIX erweitert)

sr [-i -n] ALT NEU [DATEI...]  |  sr [-i -n] -e SKRIPT [-e SKRIPT] [-f DATEI] [DATEI...]

statt sed

mehr
-e
sed-Skript (s/ALT/NEU/g, d, p, a, i, c, y, Adressen N $ /re/ N,M); mehrfach möglich
-f
Skript aus Datei lesen
-n
nichts automatisch ausgeben (nur p)
-i
Dateien direkt ändern

sr ALT NEU [DATEI...] ersetzt alle Vorkommen von ALT (fester Text, kein Muster) durch NEU, in Dateien oder Eingabe. sr -i ALT NEU DATEI ändert die Datei selbst.

ersetzt: sed

Status: fertig (Mac)

te tee fertig

Eingabe an die Ausgabe und zugleich in Dateien kopieren

te [-a -i] [DATEI...]

statt tee Tee-Object

mehr
-a
an die Dateien anhängen statt überschreiben
-i
Strg-C (SIGINT) ignorieren

befehl | te datei zeigt die Ausgabe weiter an und schreibt sie zugleich in datei. Mehrere Dateien sind möglich.

ersetzt: tee

Status: fertig (Mac)

tl tail fertig

Ende einer Datei zeigen, mit -f mitlesen

tl [-f] [-n ZEILEN | -c BYTES] [DATEI...]

statt tail

mehr
-n
Anzahl Zeilen (Standard 10)
-c
Anzahl Bytes statt Zeilen
-f
weiterlesen, wenn die Datei wächst (Ende mit Strg-C)

tl DATEI zeigt die letzten 10 Zeilen, tl -n 3 DATEI die letzten 3, tl -c 100 DATEI die letzten 100 Bytes. tl -f DATEI zeigt danach laufend, was angehängt wird (fünfmal pro Sekunde nachgesehen), bis man mit Strg-C beendet. Ohne Datei (oder mit -) wird die Standardeingabe gelesen; im Speicher bleibt immer nur das Ende.

ersetzt: tail (mit -f)

Status: fertig (Mac)

tr translate fertig

Zeichen ersetzen, löschen, zusammenfassen; Tabs wandeln; Zeilen umbrechen

tr [-d -s -c] MENGE1 [MENGE2] | tr -x N | -X N | -w N [DATEI...]

statt expand unexpand fold

mehr
-d
Zeichen aus MENGE1 löschen
-s
gleiche aufeinanderfolgende Zeichen zu einem zusammenfassen
-c
MENGE1 umkehren (alle anderen Zeichen)
-x
Tabs in Leerzeichen wandeln, Tabweite N (expand)
-X
führende Leerzeichen in Tabs wandeln, Tabweite N (unexpand)
-w
Zeilen nach N Spalten umbrechen (fold)

Ersetzt tr, expand, unexpand und fold in einem Werkzeug.

ersetzt: tr, expand, unexpand, fold

Status: fertig (Mac)

u unique fertig

Doppelte Zeilen entfernen oder zählen

u [-c -d -u -i -a] [DATEI...]

statt uniq

mehr
-c
Häufigkeit vor jede Zeile schreiben
-d
nur Zeilen, die mehrfach vorkommen
-u
nur Zeilen, die genau einmal vorkommen
-i
Groß-/Kleinschreibung ignorieren
-a
alle Doppelten entfernen, auch nicht benachbarte (Reihenfolge des ersten Auftretens)

u DATEI entfernt aufeinanderfolgende doppelte Zeilen, u -c zählt sie, u -d zeigt nur Mehrfache, u -u nur Einzelne, u -i ignoriert Groß-/Kleinschreibung. Ohne Datei (oder mit -) wird die Standardeingabe gelesen.

ersetzt: uniq

Status: fertig (Mac)

xa xargs fertig

Argumente aus der Eingabe bilden und einen Befehl damit aufrufen

xa [-n N] [-I {}] [-0] [-p N] [-t] [BEFEHL [ARG...]]

statt xargs

mehr
-n
höchstens N Argumente je Aufruf
-I
jede Zeile einzeln, {} (oder anderes Zeichen) im Befehl ersetzen
-0
Eingabe mit NUL getrennt (für f -0)
-p
bis zu N Aufrufe gleichzeitig (derzeit nacheinander)
-t
jeden Aufruf vorher auf stderr zeigen

f . | xa d liest Wörter von der Eingabe und ruft den Befehl damit auf (ohne Befehl: echo). Optionen: -n N höchstens N Argumente je Aufruf, -I {} je Zeile ein Aufruf mit Ersetzung, -0 NUL-getrennte Eingabe, -p N parallele Aufrufe, -t Aufrufe vorher anzeigen.

ersetzt: xargs

Status: fertig (Mac)

Kernsatz – Programme mit eigener Großsession

e edit fertig

Texte bearbeiten (wie nano, mit vi-Modus)

e [-m] [+ZEILE] [DATEI]

statt vi vim nano ed notepad edit

mehr
-m
im vi-Normalmodus starten (auch, wenn als vi oder vim aufgerufen)

e DATEI öffnet eine Datei zum Bearbeiten. Ersetzt vi, vim, nano, ed und notepad.

ersetzt: vi, vim, nano, ed, notepad, TextEdit

Status: fertig (Mac)

pg page fertig

Text seitenweise anzeigen (blättern, suchen, folgen)

pg [-n -S -F] [DATEI...]

statt less more

mehr
-n
Zeilennummern anzeigen
-S
lange Zeilen nicht umbrechen (Pfeil links/rechts scrollt)
-F
gleich am Ende mitlaufen wie tail -f

pg datei (lang page, Aliase less, more) zeigt Text seitenweise. Liest Dateien oder die Standardeingabe; ist die Ausgabe kein Terminal, wird einfach durchgereicht (pg datei | wc geht).

ersetzt: less, more

Status: fertig (Mac)

py python teilweise

Python 3 ausführen: Skripte, -c Befehl, -m Modul oder interaktiv

py [-c BEFEHL | -m MODUL | -i] [DATEI] [ARGUMENTE...]

statt python python3

mehr
-c
Python-Text ausführen
-m
Modul als Programm starten
-i
danach interaktiv weitermachen
-V
Version zeigen

cc übersetzt; noch nicht auf nullos/ESP32 selbst erprobt (siehe unten, was fehlt)

ersetzt: python, python3

Status: teilweise

s shell fertig

Shell: Befehle eingeben, Skripte in Bash-Syntax ausführen

s [-e -x -u -n -v -i] [-o OPTION] [-c BEFEHL | SKRIPT [ARG...]]

statt bash zsh

mehr
-c
Befehl aus dem nächsten Argument ausführen
-e
bei Fehler beenden (set -e)
-x
jeden Befehl vor dem Ausführen zeigen
-u
nicht gesetzte Variablen sind Fehler
-n
nur lesen und prüfen, nichts ausführen
-v
Eingabe beim Lesen zeigen
-i
interaktiv, auch ohne Terminal
-o
Option mit Namen (errexit, pipefail …)

s liest Befehle von der Tastatur oder aus Skripten und versteht Bash-Syntax, damit vorhandene Bash-Skripte weiterlaufen. Dazu kommt ein Zeileneditor mit Verlauf und Tab-Vervollständigung für alles.

ersetzt: bash, sh, zsh, cmd, PowerShell

Status: fertig (Mac)

Kernsatz – System (warten auf Kernel-Schnittstellen)

ck check teilweise

Dateisystem prüfen und reparieren (FAT12/16/32)

ck [-f -n -q -v] ZIEL[:N]...

statt fsck chkdsk diskutil-verify fsck.fat dosfsck

mehr
-f
gefundene Fehler reparieren
-n
nur prüfen, nichts ändern (Vorgabe)
-q
still, nur Rückgabewert
-v
jede Datei anzeigen

ck BILD prüft ein FAT-Dateisystem (ganzes Abbild, BILD:N für Partition N, oder alle FAT-Partitionen eines partitionierten Datenträgers). Ohne -f wird nichts geändert; -f repariert.

ersetzt: fsck, chkdsk, diskutil verify

Status: teilweise

dt date fertig

Datum und Uhrzeit zeigen, umrechnen, stellen

dt [-u -i -e] [-d ZEIT | -r DATEI] [+FORMAT]

statt date time timedatectl

mehr
-u
Weltzeit (UTC) statt Ortszeit
-i
ISO 8601 (2026-10-28T21:13:47+01:00)
-e
Sekunden seit 1970
-d
diese Zeit statt jetzt (2026-10-28 14:30, 28.10.2026, 14:30, @SEK, -3d, +2h, gestern, morgen)
-r
Änderungszeit der Datei
-s
Systemuhr stellen (braucht Administrator)

dt → Mi 28.10.2026 21:13:47 CET (deutsches Format). dt -u in UTC, dt -i ISO 8601, dt -e Sekunden seit 1970, dt +FORMAT mit strftime-Feldern (dt +%Y-%m-%d).

ersetzt: date, time, timedatectl

Status: fertig (Mac)

fs filesystem teilweise

Dateisystem anlegen (FAT12/16/32), mit Dateien füllen, auflisten, auspacken

fs [-t TYP -L NAME -c CLUSTER -s GRÖSSE -d ORDNER -n -f -q -v] ZIEL[:N] | fs -l ZIEL[:N] | fs -a ORDNER ZIEL[:N] | fs -x ORDNER ZIEL[:N]

statt mkfs newfs format mkfs.fat mkdosfs mcopy mdir

mehr
-t
Typ: fat12 fat16 fat32 (ohne: nach Größe)
-L
Datenträgername (höchstens 11 Zeichen)
-c
Clustergröße, z. B. 4K
-s
Abbild-Datei auf diese Größe bringen (anlegen)
-d
nach dem Anlegen den Inhalt dieses Ordners hineinkopieren
-a
Inhalt eines Ordners in ein vorhandenes Dateisystem kopieren
-l
Inhalt auflisten
-x
Inhalt in einen Ordner auspacken
-n
nur zeigen, was angelegt würde
-f
vorhandenes Dateisystem bzw. Dateien überschreiben
-q
still
-v
jede Datei anzeigen

- Typ ohne -t nach Größe: ab 64 MiB FAT32, ab 8 MiB FAT16, sonst FAT12. Clustergröße wie bei Windows (FAT32 bis 260 MiB 512 B, bis 8 GiB 4 KiB …), FAT12/16 so klein wie möglich. - Lange Dateinamen (VFAT) beim Schreiben und Lesen; Namen, die als 8.3 passen, bekommen keinen langen Eintrag (kleingeschriebene wie nk.elf über die Kleinschreib-Merker wie bei Windows). - Ein vorhandenes Dateisystem oder eine Partitionstabelle wird nur mit -f überschrieben. - Startsektor mit kleinem Startcode, der beim BIOS-Start „Kein startbares System …“ meldet. - Geprüft gegen macOS: fsck_msdos -n ohne Befund, hdiutil attach -readonly zeigt denselben Inhalt.

ersetzt: mkfs, format, newfs, diskutil eraseDisk

Status: teilweise

h help fertig

Hilfe: Werkzeuge auflisten, erklären und suchen

h [-a] [NAME...] | h -s WORT...

statt man info apropos Get-Help

mehr
-s
in allen Beschreibungen und alten Namen suchen (h -s tar)
-a
auch geplante, noch nicht gebaute Werkzeuge auflisten

h zeigt alle Werkzeuge mit einer Zeile Beschreibung, gruppiert wie in docs/katalog.md. Ersetzt man, info, help, apropos, Get-Help.

ersetzt: man, info, help, apropos, Get-Help

Status: fertig (Mac)

k kill fertig

Prozesse beenden (nach Nummer oder Name)

k [-f -n -v -q -w] [-s SIGNAL] [-u BENUTZER] PID|NAME...

statt kill killall pkill taskkill

mehr
-f
erzwingen (KILL statt TERM)
-n
nur zeigen, was beendet würde
-v
jeden beendeten Prozess anzeigen
-q
keine Meldung, wenn nichts passt
-w
warten, bis die Prozesse weg sind (höchstens 10 s)
-s
Signal schicken (TERM, KILL, INT, HUP, STOP, CONT, USR1 … oder Nummer)
-u
nur Prozesse dieses Benutzers
-l
Signale auflisten

k 123 beendet Prozess 123, k firefox alle Prozesse mit genau diesem Namen (Groß/klein egal). Nummern und Namen dürfen gemischt werden. Standard ist das höfliche TERM; -f erzwingt (KILL).

ersetzt: kill, killall, pkill, taskkill

Status: fertig (Mac)

log log fertig

Systemprotokoll und Protokolldateien lesen, filtern, verfolgen

log [-e -k -f] [-n ZEILEN] [-s ZEIT] [-p PROZESS] [-g MUSTER] [DATEI...]

statt dmesg journalctl

mehr
-n
so viele letzte Einträge (Standard 50)
-s
Zeitraum zurück: 30s, 10m, 2h, 1d, 1w (Standard 2m, mit Filter 1h)
-e
nur Fehler
-k
nur Kernel (wie dmesg)
-p
nur dieser Prozess
-g
nur Einträge mit diesem Text (Groß/klein egal)
-f
verfolgen: neue Einträge laufend zeigen

Ohne Datei liest log das Systemprotokoll und zeigt die letzten 50 Einträge, einheitlich:

ersetzt: dmesg, journalctl, Ereignisanzeige, log show

Status: fertig (Mac)

mem memory fertig

Arbeitsspeicher und Swap anzeigen

mem [-b -v -q] [-s SEK [-n RUNDEN]]

statt free vm_stat

mehr
-b
genaue Bytes statt 12G
-v
mehr: Kompressor, Seitenfehler, Ein-/Auslagerungen
-q
nur belegten Anteil in Prozent (für Skripte)
-s
alle SEK Sekunden wiederholen
-n
so viele Runden (mit -s)

belegt = Apps + fest + komprimiert (so rechnet die Aktivitätsanzeige „Belegter Speicher“). Cache sind Dateiseiten, die das System jederzeit freigeben kann; wirklich knapp wird es erst, wenn frei + Cache klein ist.

ersetzt: free, vm_stat, systeminfo (Speicher)

Status: fertig (Mac)

mo mount teilweise

Dateisysteme einhängen, aushängen und anzeigen

mo [-q] [PFAD|GERÄT] | mo [-r] QUELLE ORDNER | mo -u ORDNER

statt mount umount mountvol

mehr
-u
aushängen
-r
nur lesend einhängen
-q
ohne Kopfzeile

- mo zeigt alle Einhängepunkte (Gerät, Ordner, Typ, lokal/Netz, nur lesen). - mo PFAD|GERÄT zeigt den passenden Eintrag; liegt PFAD in keinem eigenen Einhängepunkt, das Dateisystem, auf dem er liegt (wie findmnt -T). - mo [-r] QUELLE ORDNER hängt ein, mo -u ORDNER hängt aus – ein Werkzeug statt mount/umount.

ersetzt: mount, umount, diskutil mount, mountvol

Status: teilweise

off poweroff fertig

Rechner ausschalten oder neu starten

off [-r -f -n] [-t SEK]

statt shutdown poweroff halt reboot

mehr
-r
neu starten statt ausschalten
-f
nicht nachfragen
-n
nur zeigen, was passieren würde
-t
vorher so viele Sekunden warten (Strg+C bricht ab)

off schaltet aus, off -r startet neu. Am Terminal fragt off nach (j), -f lässt die Frage weg. -t 60 wartet vorher eine Minute mit Countdown, -n zeigt nur, was passieren würde. Vorher werden alle Dateipuffer geschrieben (sync).

ersetzt: shutdown, poweroff, halt, reboot

Status: fertig (Mac)

p process fertig

Prozesse anzeigen und suchen

p [-l -t -q -x -a] [-s cpu|mem|pid|name|start] [-u BENUTZER] [NAME|PID...]

statt ps pgrep tasklist

mehr
-l
lang: Befehlszeile, Nice, Threads, virtueller Speicher, Startzeit
-t
als Baum (Kinder eingerückt unter den Eltern)
-q
nur Prozessnummern (für Skripte, wie pgrep)
-x
Name muss genau passen
-a
Muster auch in der Befehlszeile suchen
-s
sortieren nach cpu, mem, pid, name oder start
-u
nur Prozesse dieses Benutzers

p zeigt alle Prozesse: Nummer, Eltern, Benutzer, Zustand, Speicher (resident), CPU-Zeit, Name. p NAME sucht (Teilstück, Groß/klein egal), p 123 zeigt Prozess 123. Mehrere Muster sind „oder“.

ersetzt: ps, tasklist, Get-Process

Status: fertig (Mac)

part partition fertig

Datenträger und Abbilder partitionieren (GPT und MBR)

part [-n -f -q -v] BILD [gpt|mbr [GRÖSSE]] [add GRÖSSE|rest TYP [NAME]] [del N] [type N TYP] [name N NAME] [boot N] [fix]

statt fdisk gdisk parted diskpart

mehr
-n
nur zeigen, was herauskäme (nichts schreiben)
-f
vorhandene Partitionstabelle durch neue ersetzen
-q
Tabelle danach nicht anzeigen
-v
auch Typ-GUIDs, Kennungen und Merkmale zeigen

part BILD zeigt die Partitionstabelle, Befehle dahinter ändern sie – beliebig viele in einem Aufruf, geschrieben wird erst am Ende (mit -n gar nicht):

ersetzt: fdisk, gdisk, parted, diskpart, diskutil partition

Status: fertig (Mac)

sp space fertig

Größe, belegten und freien Platz von Dateisystemen zeigen

sp [-a -b -i -q] [PFAD|BILD[:N]]...

statt df

mehr
-a
auch Dateisysteme ohne Größe (Pseudo-Dateisysteme)
-b
genaue Zahlen in Bytes
-i
Dateieinträge (Inodes) statt Bytes
-q
ohne Kopfzeile

sp zeigt alle eingehängten Dateisysteme mit Größe, belegt, frei und Anteil; sp PFAD das Dateisystem, auf dem PFAD liegt. Abbild-Dateien mit FAT (sp stick.img, sp stick.img:1) werden direkt gelesen – ohne Einhängen, auch auf nullos.

ersetzt: df, Get-PSDrive, diskutil info

Status: fertig (Mac)

sys system fertig

Systemangaben: Betriebssystem, Rechner, CPU, Speicher, Laufzeit

sys [-a -s -n -r -m -v -o]

statt uname sw_vers ver systeminfo

mehr
-a
alles in einer Zeile wie uname -a
-s
Kernelname
-n
Rechnername
-r
Kernel-Version (kurz)
-v
Kernel-Version (lang)
-m
Maschine (arm64, x86_64 …)
-o
Betriebssystem (macOS, nullos)

Mit Optionen verhält sich sys wie uname: -s Kernelname, -n Rechnername, -r Version, -v lange Version, -m Maschine, -o Betriebssystem, mehrere in uname-Reihenfolge in einer Zeile; sys -a gibt genau uname -a aus.

ersetzt: uname, sw_vers, ver, systeminfo, hostnamectl

Status: fertig (Mac)

tp top fertig

Prozesse und Auslastung live: CPU je Kern, Speicher, Swap, Prozesse

tp [-b -a -1] [-d SEK] [-n RUNDEN] [-z ZEILEN] [-s cpu|mem|pid|name|zeit] [-u BENUTZER] [MUSTER]

statt top htop btop taskmgr

mehr
-b
Stapelmodus: Text ohne Terminalsteuerung (für Skripte und Pipes)
-d
Takt in Sekunden (Standard 1, Bruchteile erlaubt)
-n
Stapelmodus: so viele Runden ausgeben
-z
Stapelmodus: nur so viele Prozesszeilen
-s
sortieren nach cpu, mem, pid, name oder zeit
-u
nur Prozesse dieses Benutzers
-a
ganze Befehlszeile statt Name
-1
keine Zeile je Kern, nur Summe

tp zeigt live, was der Rechner tut – ein Werkzeug statt top, htop, btop, Task-Manager, Aktivitätsanzeige und macmon:

ersetzt: top, htop, btop, Task-Manager, Aktivitätsanzeige, macmon

Status: fertig (Mac)

up uptime fertig

wie lange das System läuft, Benutzer, Last

up [-s -p -q]

statt uptime

mehr
-s
Startzeitpunkt (JJJJ-MM-TT HH:MM:SS)
-p
in Worten (2 Tagen, 3 Stunden …)
-q
nur Sekunden seit Start

up → 21:12 läuft seit 2 T 09:11, 2 Benutzer, Last 5.80 7.16 6.25 (Uhrzeit, Laufzeit in Tagen und Stunden:Minuten, angemeldete Sitzungen, Last über 1/5/15 Minuten).

ersetzt: uptime

Status: fertig (Mac)

1. Dateien und Verzeichnisse

cch cache teilweise

Dateicache anzeigen, vorwärmen, leeren

cch [-w] DATEI... | cch -s | cch -p

statt fincore readahead purge

mehr
-w
Datei vorher einlesen (Cache wärmen)
-s
erst alles auf den Datenträger schreiben (sync)
-p
gesamten Cache leeren (Root)
-q
still

cch DATEI... zeigt, wie viele Seiten der Datei im Speicher-Cache liegen (fincore), -w liest sie vorher ein (wärmt), -s schreibt alles zurück (sync), -p leert den ganzen Cache (Mac: purge, Linux: drop_caches, braucht Root; nicht automatisch getestet). Mac/Linux über mmap+mincore (plat_host.c); auf nullos wartet es auf den Seitencache im Kernel (plat_nullos.c meldet „noch nicht verfügbar“).

ersetzt: fincore, readahead, SMARTDRV, FASTOPEN, sync, echo 3 > drop_caches, purge

Status: teilweise

hl hardlink fertig

Inhaltsgleiche Dateien durch harte Links ersetzen und so Platz sparen

hl [-n -v -q] ORDNER...

statt hardlink rdfind jdupes

mehr
-n
nur zeigen, was verlinkt würde
-v
jedes Paar anzeigen
-q
keine Zusammenfassung

hl ORDNER... sucht Dateien mit gleichem Inhalt (und gleichen Rechten, gleiches Laufwerk) und ersetzt Duplikate durch harte Links auf eine Datei. -n Probelauf, -v zeigt Paare. Leere Dateien bleiben. Ersetzt über Nebendatei + rename, nie ein Zwischenzustand ohne Datei. Eigentümer/Zeit werden nicht verglichen.

ersetzt: hardlink

Status: fertig (Mac)

ins install teilweise

Dateien mit festen Rechten an ihren Platz kopieren

ins [-m RECHTE] [-v -p] QUELLE... ZIEL | ins [-m RECHTE] -d ORDNER...

statt install

mehr
-m
Rechte oktal (Standard 755), mit Wert
-d
nur Ordner anlegen (samt Eltern)
-p
Zielordner (samt Eltern) vorher anlegen
-v
jede Aktion anzeigen

ins QUELLE ZIEL kopiert und setzt Rechte (Standard 755, -m 644). ins -d ORDNER legt Ordner samt Eltern an, -p legt den Zielordner an. Schreibt erst in eine Nebendatei und benennt dann um, überschreibt also auch laufende Programme gefahrlos. Nicht dabei: Eigentümer (-o/-g), -s Strippen.

ersetzt: install

Status: teilweise

lk lock teilweise

Befehl unter einer Dateisperre ausführen (nur einer zur Zeit)

lk [-n -s -q] SPERRDATEI BEFEHL [ARG...]

statt flock lockf

mehr
-n
nicht warten; wenn gesperrt, Rückgabe 1
-s
gemeinsame (lesende) statt ausschließende Sperre
-q
keine Fehlermeldung

lk SPERRDATEI BEFEHL... führt den Befehl aus, solange es die Sperre hat; ein zweiter lk mit derselben Datei wartet (oder bricht mit -n ab). -s = gemeinsame Sperre. Rückgabe = die des Befehls.

ersetzt: flock, lockf, lslocks

Status: teilweise

loc locate fertig

Dateien über einen Index schnell finden

loc [-i] MUSTER... | loc -u [WURZEL]

statt locate updatedb plocate mdfind

mehr
-u
Index neu aufbauen ($LOCDB oder ~/.loc.db)
-i
Groß-/Kleinschreibung ignorieren

loc -u [WURZEL] baut einen Index (Standard /, Datei $LOCDB oder ~/.loc.db), loc MUSTER... sucht darin: Teilwort oder Muster mit * ? [a-z]; mehrere Muster müssen alle passen; -i ohne Groß/klein. Index ist Klartext (ein Pfad je Zeile). Kein Dienst im Hintergrund – wer aktuell sein will, ruft loc -u per Zeitplan. Nicht dabei: Metadatensuche (mdfind, mdls).

ersetzt: locate, updatedb, plocate, mdfind, mdutil, mdimport, tracker, mdls

Status: fertig (Mac)

mf manifest fertig

Prüfliste eines Ordners erstellen und später auf Veränderungen prüfen

mf -c ORDNER > LISTE | mf -s [-q -v] ORDNER LISTE

statt mtree nmtree debsums aide tripwire sfc

mehr
-c
Prüfliste erzeugen (auf Standardausgabe)
-s
Ordner gegen Liste prüfen (Rückgabe 1 bei Abweichung)
-q
keine Einzelmeldungen
-v
auch unveränderte Einträge zeigen

mf -c ORDNER > liste schreibt je Eintrag eine Zeile Art Rechte Größe SHA-256 Pfad (Art: f Datei, d Ordner, l Link mit Ziel). mf -s ORDNER liste vergleicht und meldet NEU, FEHLT, INHALT, GRÖSSE, RECHTE, ART; Rückgabe 1 bei jeder Abweichung. -q still, -v auch Unveränderte. SHA-256 selbst geschrieben (wie efs, mit Prüfwerten geprüft). Sortierte, textuelle Liste – lässt sich mit di vergleichen. Zeiten und Eigentümer sind absichtlich nicht drin (ändern sich bei jedem Kopieren). Die Liste schützt nur, wenn sie selbst unveränderlich aufbewahrt wird (z. B. fa +immutable oder auf anderem Medium). Nicht dabei: Paketdatenbanken (debsums, rpm -V), Signaturen (spctl, csrutil).

ersetzt: mtree, nmtree, debsums, rpm -V, csrutil, spctl, sfc, DISM, veriexec, freebsd-update IDS, aide, tripwire

Status: fertig (Mac)

mn mknode teilweise

Pipe (FIFO) oder Gerätedatei anlegen

mn [-m RECHTE] [-v] NAME... | mn NAME b|c|p [HAUPT NEBEN]

statt mkfifo mknod makedevs

mehr
-m
Rechte oktal (vorn als erste Option)
-v
Namen anzeigen

mn NAME... legt Pipes (FIFO) an, mn NAME p genauso, mn NAME c|b HAUPT NEBEN Gerätedateien (braucht Root; auf nullos noch nicht verfügbar). -m 600 setzt Rechte (muss vorn stehen).

ersetzt: mkfifo, mknod, makedevs

Status: teilweise

of openfiles teilweise

Zeigt, welche Prozesse welche Dateien offen haben

of [-q] [DATEI...] | of -p PID

statt lsof fuser fstat lsfd handle

mehr
-q
still, nur Rückgabewert (0 = jemand hat sie offen)
-p
nur die Dateien dieses Prozesses (mit Wert)

of DATEI... zeigt, welche Prozesse die Datei (oder etwas in dem Ordner) offen haben: Datei, PID, Name, Nummer. of -p PID listet die offenen Dateien eines Prozesses, of ohne Angabe alle. Rückgabe 0, wenn etwas gefunden wurde (-q still). Mac: über libproc, ohne Root nur eigene Prozesse. Nicht dabei: Sockets/Pipes, Speicherabbilder. nullos braucht dafür eine Kernel-Auskunft (plat_nullos.c meldet „noch nicht verfügbar“).

ersetzt: lsof, fuser, openfiles, fstat, lsfd, handle, procstat

Status: teilweise

op open teilweise

Datei, Ordner oder Adresse mit dem passenden Programm öffnen

op [-n] ZIEL...

statt open xdg-open start

mehr
-n
nur zeigen, welches Programm gestartet würde

op ZIEL... öffnet Dateien/Ordner/Adressen mit dem passenden Programm: Mac open, Linux xdg-open. OPENER=prog erzwingt ein Programm, -n zeigt nur, was liefe. Auf nullos (keine Fenster) wählt op nach Endung: Ordner → l, Text/Quelltext → sh, sonst → hx (Übersetzung ist nur getestet für den Host-Zweig).

ersetzt: xdg-open, open, start

Status: teilweise

sd substdrive teilweise

Ordner einen Laufwerksbuchstaben zuordnen (Tabelle)

sd | sd X: ORDNER | sd -d X: | sd -r X:/pfad

statt subst join

mehr
-d
Zuordnung entfernen
-r
Pfad mit Laufwerksbuchstabe in den echten Pfad auflösen

sd X: ORDNER ordnet dem Buchstaben einen Ordner zu, sd listet, sd -d X: löscht, sd -r X:\\src\\a.c liefert den echten Pfad (ORDNER/src/a.c; / und \\ gehen). Die Zuordnung steht nur in der Tabelle ($SDTAB, sonst ~/.sdtab). Der Kernel kennt sie noch nicht: Programme sehen X: erst, wenn der Pfadauflöser des Kernels/der libc die Tabelle benutzt (Wunsch an die Hauptsession). join (Laufwerk in Ordner einblenden) ist nicht dabei.

ersetzt: subst, SUBST, JOIN

Status: teilweise

sn shortname teilweise

8.3-Kurznamen berechnen, wie FAT sie für lange Namen vergibt

sn [-l] NAME...

statt fsutil-8dot3name

mehr
-l
Langname und Kurzname nebeneinander

sn NAME... druckt den 8.3-Kurznamen (PROGRA~1.TXT), den FAT/Windows für einen langen Namen vergibt, -l mit Langname. Passt der Name schon in 8.3, wird er nur großgeschrieben. Die Zähler ~1, ~2 ergeben sich aus den Geschwistern im selben Ordner (nach Namen sortiert) – echtes Windows vergibt sie in Anlegereihenfolge, kann also abweichen. Schaltet nichts am Dateisystem um (fsutil 8dot3name set …) – das ist eine Einstellung des Dateisystems, kommt mit nullos-FAT.

ersetzt: fsutil 8dot3name

Status: teilweise

sy sync fertig

Zwischengespeicherte Daten auf den Datenträger schreiben

sy [-q] [DATEI...]

statt sync fsync

mehr
-q
Fehler nicht melden, nur Rückgabewert

sy schreibt alle Zwischenspeicher auf den Datenträger, sy DATEI... nur diese Dateien (fsync).

ersetzt: sync, fsync

Status: fertig (Mac)

tmp tempfile fertig

Eindeutige Temporärdatei oder -ordner anlegen und Namen ausgeben

tmp [-d -u -n] [-p ORDNER] [VORLAGE]

statt mktemp

mehr
-d
Ordner statt Datei
-u
wieder löschen, nur Namen ausgeben
-n
nur einen freien Namen ausgeben, nichts anlegen
-p
Ordner für das Ergebnis (Option mit Wert)

tmp legt eine leere Datei an und druckt den Namen; -d Ordner, -p ORDNER, -u löschen, -n nur Namen. Vorlage endet auf XXX… (Standard tmp.XXXXXX), Rechte 600/700. Ohne -p gilt $TMPDIR, sonst /tmp.

ersetzt: mktemp

Status: fertig (Mac)

trs trash fertig

Papierkorb: Dateien wegwerfen, die sich zurückholen lassen

trs [-v] DATEI... | trs -l | trs -r NAME... | trs -e

statt trash trash-put gio-trash

mehr
-l
Inhalt des Papierkorbs zeigen (Name und Herkunft)
-r
zurückholen an den alten Ort
-e
Papierkorb endgültig leeren
-v
jede Datei anzeigen

trs DATEI... verschiebt in den Papierkorb ($TRASHDIR, sonst ~/.trash), trs -l zeigt Name und alten Ort, trs -r NAME holt zurück (überschreibt nie), trs -e leert endgültig. Liegt die Datei auf einem anderen Laufwerk, wird kopiert und dann gelöscht (Ordner dort: Fehler). Kein eigener Papierkorb je Laufwerk, keine Größenbegrenzung, keine automatische Leerung nach X Tagen.

ersetzt: gio trash, trash-put, trash

Status: fertig (Mac)

tru truncate fertig

Dateigröße setzen (kürzen oder mit Nullen verlängern)

tru [-c -v] -s GRÖSSE DATEI...

statt truncate fallocate mkfile

mehr
-s
Größe: 100, 4K, +1M (mehr), -512 (weniger), %4096 (aufrunden), /4096 (abrunden)
-c
fehlende Dateien nicht anlegen
-v
Größen anzeigen

tru -s 100 DATEI setzt die Größe (kürzt oder füllt mit Nullen auf), +1M / -512 relativ, %4096 aufrunden, /4096 abrunden. Fehlende Dateien werden angelegt (außer -c). Legt keine „echten“ reservierten Blöcke an (kein fallocate): Dateien dürfen löchrig sein.

ersetzt: truncate, fsutil file setEOF, fallocate, mkfile, fsutil file createnew

Status: fertig (Mac)

wh which fertig

Zeigt, welche Datei ein Befehl im PATH ist

wh [-a -q] BEFEHL...

statt which type whereis where

mehr
-a
alle Treffer im PATH, nicht nur den ersten
-q
still, nur Rückgabewert

wh BEFEHL zeigt den Pfad im PATH, -a alle Treffer, -q still (nur Rückgabewert 0/1). Eingebaute Shell-Befehle kennt wh nicht (das macht die Shell).

ersetzt: which, type, command -v, where, whereis

Status: fertig (Mac)

xat xattr teilweise

Erweiterte Attribute an Dateien anzeigen, lesen, setzen, löschen

xat [-v] DATEI... | xat -g NAME DATEI... | xat -s NAME WERT DATEI... | xat -d NAME DATEI...

statt xattr getfattr setfattr attr

mehr
-v
Namen mit Werten anzeigen
-g
Wert eines Attributs ausgeben
-s
Attribut setzen
-d
Attribut löschen

xat DATEI listet erweiterte Attribute, -v mit Werten, xat -g NAME DATEI liest, xat -s NAME WERT DATEI setzt, xat -d NAME DATEI löscht. Werte sind Text. Mac und Linux gehen (plat_host.c); auf nullos erst mit dem Dateisystem (plat_nullos.c meldet „noch nicht verfügbar“). Namen wie user.xyz (Linux verlangt den Namensraum).

ersetzt: getfattr, setfattr, attr, xattr, extattr

Status: teilweise

xc exchange fertig

Zwei Dateien oder Ordner miteinander vertauschen

xc [-v] A B

statt exch renameat2-exchange

mehr
-v
Vertauschung anzeigen

xc A B vertauscht zwei Dateien/Ordner (auch gemischt) über einen Zwischennamen im Ordner von A; schlägt ein Schritt fehl, wird zurückgerollt. Nicht atomar (kurz fehlt B), anders als Linux renameat2(RENAME_EXCHANGE); das kann der Kernel später liefern. A und B müssen auf demselben Laufwerk liegen.

ersetzt: exch

Status: fertig (Mac)

2. Rechte, Eigentum, Attribute

acl acl teilweise

Zugriffslisten (ACL) anzeigen, setzen, kopieren, löschen

acl DATEI... | acl -s TEXT DATEI... | acl -f QUELLE ZIEL... | acl -x DATEI...

statt getfacl setfacl icacls

mehr
-s
ACL aus Text setzen (Format wie die Anzeige)
-f
ACL von QUELLE auf die Ziele kopieren
-x
alle Einträge entfernen

acl DATEI zeigt die ACL, acl -s TEXT DATEI setzt sie (Format der Anzeige), acl -f QUELLE ZIEL... kopiert sie, acl -x DATEI löscht sie. Mac: erweiterte ACLs (ACL_TYPE_EXTENDED, wie ls -le / chmod +a). Linux-POSIX-ACLs (getfacl) und Windows-DACLs sind nicht dabei; nullos wartet auf Dateisystem-Syscall (plat_nullos.c). Einfache Rechte: siehe cm, Eigentümer: ow.

ersetzt: getfacl, ls -le, icacls, setfacl, chmod +a

Status: teilweise

cm chmod fertig

Zugriffsrechte ändern (oktal oder u+x, go-w)

cm [-r -v -n] RECHTE DATEI...

statt chmod icacls cacls

mehr
-r
rekursiv
-v
jede Änderung anzeigen
-n
nur zeigen, was passieren würde

cm 644 DATEI, cm u+x,go-w DATEI, cm -r 755 ORDNER. Oktal und symbolisch (ugoa, +-=, rwxXst, Kopie u/g/o). -n zeigt nur, was passieren würde, -v jede Änderung. Symlinks werden übersprungen.

ersetzt: chmod, icacls, cacls

Status: fertig (Mac)

efs encryptfile fertig

Datei mit Passwort verschlüsseln und entschlüsseln

efs -e|-d [-k SCHLÜSSELDATEI] DATEI [AUSGABE]

statt cipher gpg-symmetric

mehr
-e
verschlüsseln (Ausgabe DATEI.efs)
-d
entschlüsseln (DATEI.efs -> DATEI)
-k
Passwort aus dieser Datei lesen (mit Wert)

efs -e DATEI verschlüsselt nach DATEI.efs, efs -d DATEI.efs entschlüsselt. Passwort aus $EFSPASS, -k SCHLÜSSELDATEI oder Abfrage (ohne Anzeige; beim Verschlüsseln zweimal). Verfahren: Passwort → PBKDF2-HMAC-SHA256 (20000 Runden, Salz 16 Byte) → ChaCha20 (Nonce 12 Byte) + HMAC-SHA256 über alles (erst prüfen, dann entschlüsseln; falsches Passwort oder Änderung → nichts wird geschrieben). Dateiaufbau: NEFS1, Salz, Nonce, Daten, MAC (65 Byte Mehrgröße). SHA-256, HMAC, PBKDF2 und ChaCha20 sind selbst geschrieben (sha.c) und gegen Prüfwerte aus Python hashlib / OpenSSL geprüft (efs -T). Nicht von Dritten geprüft – nicht für Hochsicherheit; kein Löschen des Klartexts nach dem Verschlüsseln. Nicht dabei: NTFS-EFS-Schlüsselverwaltung, Ordner (erst tar/zp).

ersetzt: cipher

Status: fertig (Mac)

fa fileattr teilweise

Dateiattribute anzeigen und setzen (unveränderbar, versteckt, nicht sichern …)

fa [-v] [+ATTRIBUT -ATTRIBUT ...] DATEI... | fa -l

statt chattr lsattr chflags attrib

mehr
-l
alle Attributnamen dieser Plattform zeigen
-v
nach dem Ändern den neuen Zustand zeigen

fa DATEI zeigt Attribute, fa +immutable -hidden DATEI ändert, fa -l listet die Namen dieser Plattform. Mac: nodump immutable append opaque hidden (Benutzer), archived simmutable sappend (nur Root). Linux-chattr (ioctl) und Windows-Attribute hängen am Dateisystem von nullos und kommen mit docs/syscalls.md. In plat_nullos.c meldet fa bis dahin „noch nicht verfügbar“.

ersetzt: chattr, chflags, attrib, lsattr, ls -lO, ls -lo, compact, SetFile, GetFileInfo

Status: teilweise

3. Textausgabe und Textverarbeitung

col colfilter fertig

Rückschritte, Wagenrücklauf und Rückwärts-Zeilenvorschub auswerten (Handbuchtext säubern)

col [-b] [-u] [DATEI]

statt col colcrt ul

mehr
-b
keine Rückschritte ausgeben: Überschreiben zählt nicht, nur das letzte Zeichen
-u
Fett und Unterstrichen als Terminal-Escapefolgen statt Rückschritte (ul)

col DATEI wertet Rückschritt (\b), Wagenrücklauf (\r), Tabulator, senkrechten Tab und Rückwärts-Zeilenvorschub (ESC 7) aus und gibt die fertigen Zeilen aus. Überdruck wird erkannt: dasselbe Zeichen zweimal = fett, _ plus Zeichen = unterstrichen. Ohne Option bleibt das als x\bx bzw. _\bx erhalten, -b behält nur das letzte Zeichen (reiner Text zum Weiterverarbeiten, z. B. man x | col -b), -u macht daraus Terminalfolgen (ESC[1m, ESC[4m; das Verhalten von ul). Tabulatoren werden zu Leerzeichen (wie col -x), UTF-8 wird zeichenweise verstanden.

ersetzt: col, colcrt, ul

Status: fertig (Mac)

doc docconvert fertig

Markdown in HTML, Text oder Handbuchseite umwandeln

doc [-t html|text|man] [-w BREITE] [-a] [-p] [-o DATEI] [DATEI...]

statt pandoc textutil

mehr
-t
Ausgabeformat: html (Standard), text, man
-w
Zeilenbreite für text und man (Standard 78)
-a
Hervorhebungen mit Terminal-Escape-Folgen (fett, unterstrichen)
-p
bei html: vollständige Seite mit Kopf und Titel
-o
Ausgabe in DATEI (Format aus .txt / .1 / .man, sonst html)

doc [-t html|text|man] [-w BREITE] [-a] [-p] [-o DATEI] [DATEI...] liest Markdown (Dateien oder Standardeingabe) und schreibt HTML, umbrochenen Klartext oder eine Handbuchseite fürs Terminal.

ersetzt: pandoc, textutil

Status: fertig (Mac)

eol lineends fertig

Zeilenenden umwandeln (LF, CRLF, CR)

eol [-u | -d | -m] [-c] [-n] [DATEI...]

statt dos2unix unix2dos

mehr
-u
nach Unix (LF, Standard)
-d
nach DOS/Windows (CRLF)
-m
nach altem Mac (CR)
-c
nur zählen, welche Zeilenenden vorkommen
-n
nur zeigen, wie viele Zeilenenden sich änderten

eol -u DATEI... macht aus CRLF und CR ein LF (dos2unix), eol -d DATEI... aus allem CRLF (unix2dos), -m ein einzelnes CR (altes Mac). Mit Dateiangabe wird an Ort und Stelle umgeschrieben (über eine Zwischendatei, Rechte bleiben); ohne Datei arbeitet eol als Filter von der Standardeingabe zur Standardausgabe. -c zählt nur die vorkommenden Zeilenenden (LF/CRLF/CR), -n zeigt, wie viele sich ändern würden, und lässt die Datei in Ruhe.

ersetzt: dos2unix, unix2dos

Status: fertig (Mac)

fmt reflow fertig

Absätze neu umbrechen

fmt [-w BREITE] [-s] [-u] [DATEI...]

statt fmt

mehr
-w
Zeilenbreite (Standard 75)
-s
nur zu lange Zeilen brechen, nichts zusammenfügen
-u
gleichmäßige Abstände (ein Leerzeichen, auch nach Satzende)

fmt DATEI fügt die Zeilen eines Absatzes zusammen und bricht sie neu bei 75 Zeichen (-w N ändert das). Absätze trennen Leerzeilen (bleiben erhalten). Die erste Zeile behält ihre Einrückung, die folgenden die der zweiten Zeile. Nach einem Satzende (.?!) bleiben zwei Leerzeichen, wenn sie schon in der Eingabe standen oder das Satzende am Zeilenende lag; -u macht überall eines. -s bricht nur zu lange Zeilen und fügt nichts zusammen.

ersetzt: fmt

Status: fertig (Mac)

ic charset fertig

Text von einem Zeichensatz in einen anderen umwandeln

ic [-c] [-l] -f VON -t NACH [DATEI...]

statt iconv

mehr
-f
Zeichensatz der Eingabe (Standard UTF-8)
-t
Zeichensatz der Ausgabe (Standard UTF-8; //IGNORE und //TRANSLIT erlaubt)
-c
nicht umwandelbare Zeichen weglassen
-l
bekannte Zeichensätze auflisten

ic -f VON -t NACH [DATEI...] wandelt Text um (iconv); Standard UTF-8 → UTF-8 (prüft also auf gültiges UTF-8). Bekannt (ic -l): UTF-8, ASCII, ISO-8859-1/-2/-15, CP1252, CP437, CP850, KOI8-R, UTF-16/-16LE/-16BE, UTF-32/-32LE/-32BE; Schreibweisen mit oder ohne Bindestrich, Aliase wie latin1, windows-1252. UTF-16/UTF-32 als Ausgabe schreiben eine BOM (little endian), als Eingabe erkennen sie die BOM. Ungültige Eingabe oder nicht darstellbare Zeichen sind ein Fehler mit Byte-Position; -c bzw. //IGNORE lässt sie weg, //TRANSLIT ersetzt durch ? (keine Umschrift wie ä→ae).

ersetzt: iconv

Status: fertig (Mac)

js json fertig

JSON lesen, filtern und umformen (jq-Filtersprache)

js [-n -r -j -c -s -e -S -a -R] [--tab] [--indent N] [--arg NAME WERT] [--argjson NAME JSON] FILTER [DATEI...]

statt jq

mehr
-n
keine Eingabe lesen, . ist null (mit input/inputs selbst lesen)
-r
Zeichenketten ohne Anführungszeichen ausgeben
-j
wie -r, ohne Zeilenumbruch
-c
kompakte Ausgabe
-s
alle Eingabewerte zu einem Array sammeln
-R
Eingabe zeilenweise als Text lesen
-e
Ausgangswert 1, wenn die letzte Ausgabe false/null ist, 4 ohne Ausgabe
-S
Objektschlüssel sortieren
-a
nur ASCII ausgeben (\uXXXX)
-f
Filter aus Datei lesen
--tab
Einrückung mit Tabulator
--indent
Einrückung mit N Leerzeichen (0 bis 7)
--arg
Variable $NAME mit Textwert
--argjson
Variable $NAME mit JSON-Wert
--slurpfile
Variable $NAME mit allen JSON-Werten einer Datei
--rawfile
Variable $NAME mit dem Text einer Datei
--args
restliche Argumente nach $ARGS.positional (Text)
--jsonargs
restliche Argumente nach $ARGS.positional (JSON)
--stream
Eingabe als Pfad/Blatt-Ereignisse

js FILTER [DATEI...] liest JSON-Werte (beliebig viele hintereinander) und wendet die Filtersprache von jq an: js '.a[] | select(.n > 1) | {n, name}' daten.json. Ersetzt jq.

ersetzt: jq

Status: fertig (Mac)

lu lookup fertig

In einer sortierten Datei alle Zeilen mit einem bestimmten Anfang finden

lu [-f] [-d] [-t ZEICHEN] ANFANG [DATEI]

statt look

mehr
-f
Groß-/Kleinschreibung ignorieren
-d
nur Buchstaben, Ziffern und Leerzeichen vergleichen
-t
Zeichen, an dem der Vergleich der Zeile endet

lu ANFANG [DATEI] gibt alle Zeilen aus, die mit ANFANG beginnen, aus einer sortierten Datei (Binärsuche, auch bei sehr großen Wörterlisten schnell). Ohne Datei /usr/share/dict/words. -f ignoriert Groß-/Kleinschreibung (Datei muss entsprechend sortiert sein, z. B. sort -f), -d vergleicht nur Buchstaben, Ziffern und Leerzeichen, -t Z beendet den Vergleich der Zeile am Zeichen Z. Von der Standardeingabe (-) wird linear gesucht. Rückgabe 1, wenn nichts gefunden.

ersetzt: look

Status: fertig (Mac)

mst ministat fertig

Statistik und Student-t-Test für Messreihen vergleichen

mst [-q] [-c SICHERHEIT] [-w BREITE] [DATEI...]

statt ministat

mehr
-q
kein Schaubild, nur Tabelle und Test
-c
Sicherheit in Prozent: 80 90 95 98 99 99.5 (Standard 95)
-w
Breite des Schaubilds (Standard 60)

mst DATEI1 DATEI2 … liest je Datei eine Messreihe (Zahlen, durch Leerzeichen oder Zeilen getrennt, # = Kommentar; ohne Datei von der Standardeingabe, bis zu 8 Reihen) und zeigt Schaubild, Min/Max/Median/Mittel/Standardabweichung und – für jede weitere Reihe gegen die erste – den Student-t-Test (gepoolte Varianz, zweiseitig): „Unterschied bei 95 % Sicherheit“ mit Differenz ± Spanne und Prozent, oder „kein Unterschied belegt“.

ersetzt: ministat

Status: fertig (Mac)

nf numfmt fertig

Zahlen in lesbare Größen (1,3K, 4,5M) umwandeln und zurück

nf [--from=none|auto|si|iec|iec-i] [--to=none|si|iec|iec-i] [--round=...] [--format=%.2f] [--padding=N] [--suffix=S] [--field=N] [-d TRENNER] [--header[=N]] [--invalid=...] [ZAHL...]

statt numfmt

mehr
--to
Ausgabe skalieren: si (1000, k M G), iec (1024, K M G), iec-i (Ki Mi Gi)
--from
Eingabe mit Einheit lesen (1.5K, 2Gi)
--round
up, down, from-zero (Standard), towards-zero, nearest
--format
printf-Format für die Zahl, z. B. %.2f
--padding
Breite; negativ = linksbündig
--suffix
Text hinter Zahl und Einheit (z. B. B)
--field
welche Spalte umgewandelt wird (Standard 1)
-d
Spaltentrenner statt Leerraum
--header
erste N Zeilen unverändert lassen
--invalid
bei ungültiger Zahl: abort, fail, warn, ignore

nf --to=si 1234567 gibt 1.3M aus, nf --to=iec 4096 4.0K, nf --to=iec-i 4.0Ki; nf --from=si 1.5K gibt 1500 (--from=auto erkennt K = 1000 und Ki = 1024). Zahlen stehen als Argumente oder zeilenweise auf der Standardeingabe; --field=N und -d TRENNER wandeln eine Spalte um, --header[=N] lässt Kopfzeilen in Ruhe. Weiter: --round=up|down| from-zero|towards-zero|nearest (Standard from-zero wie GNU), --format=%.2f, --padding=N (negativ = linksbündig), --suffix=B, --invalid=abort|fail|warn|ignore. Optionen dürfen hinter den Zahlen stehen.

ersetzt: numfmt

Status: fertig (Mac)

nl numberlines fertig

Zeilen nummerieren

nl [-b a|t|n] [-n ln|rn|rz] [-w BREITE] [-s TRENNER] [-v START] [-i SCHRITT] [DATEI...]

statt nl

mehr
-b
welche Zeilen: a alle, t nur nicht leere (Standard), n keine
-n
Format: ln links, rn rechts (Standard), rz rechts mit Nullen
-w
Breite der Nummer (Standard 6)
-s
Trenner hinter der Nummer (Standard Tabulator)
-v
Startnummer (Standard 1)
-i
Schrittweite (Standard 1)

nl DATEI... stellt jeder nicht leeren Zeile eine Nummer voran. Nummern laufen über mehrere Dateien weiter. -b a|t|n (alle / nicht leere / keine), -n ln|rn|rz (links, rechts, rechts mit Nullen), -w Breite (6), -s Trenner (Tabulator), -v Start (1), -i Schritt (1). Optionswerte dürfen angehängt sein (-w4).

ersetzt: nl

Status: fertig (Mac)

pgn paginate fertig

Text in Seiten und Spalten für den Druck aufteilen

pgn [-2..-9] [-a] [-d] [-t] [-m] [-n[BREITE]] [-h KOPF] [-l ZEILEN] [-w BREITE] [-o EINZUG] [-F] [DATEI...]

statt pr

mehr
-N
in N Spalten setzen (-2 bis -9), spaltenweise gefüllt
-a
Spalten zeilenweise füllen
-m
Dateien nebeneinander setzen
-n
Zeilen nummerieren
-t
ohne Kopf und Fuß
-d
doppelter Zeilenabstand
-h
Text statt Dateiname im Kopf
-l
Seitenlänge in Zeilen (Standard 66)
-w
Zeilenbreite (Standard 72)
-o
Einrückung links
-F
Seitenvorschub statt Füllzeilen

pgn DATEI teilt Text in Seiten zu 66 Zeilen: Kopf (zwei Leerzeilen, dann Datum der Datei, Dateiname mittig und Seite N, zwei Leerzeilen), Text, Fuß aus Leerzeilen. -2 bis -9 setzt in Spalten (spaltenweise, mit -a zeilenweise gefüllt), -m stellt mehrere Dateien nebeneinander, -n[BREITE] nummeriert, -d doppelter Zeilenabstand, -t ohne Kopf und Fuß, -h TEXT statt Dateiname, -l Seitenlänge, -w Breite (72), -o Einzug, -F Seitenvorschub statt Füllzeilen. Tabulatoren werden zu Leerzeichen, überlange Spaltenzeilen abgeschnitten (UTF-8 zeichenweise).

ersetzt: pr

Status: fertig (Mac)

pli plist fertig

Property Lists (XML, binär, JSON) lesen, ändern, umwandeln

pli [-x|-b|-j] [-i] [-t] [-o AUS] [-g PFAD] [-s PFAD=WERT] [-d PFAD] DATEI

statt plutil

mehr
-x
als XML ausgeben
-b
als binäre Plist ausgeben
-j
als JSON ausgeben (Standard)
-i
Datei an Ort und Stelle schreiben (Format bleibt, sonst -x/-b/-j)
-t
nur prüfen, ob lesbar
-o
Ausgabe in Datei statt stdout
-g
nur den Wert unter PFAD ausgeben (a.b.0)
-s
PFAD=WERT setzen (WERT als JSON, sonst Text; @date:… @data:BASE64)
-d
PFAD löschen

pli DATEI gibt eine Property List als JSON aus. Liest XML-, Binär- (bplist00) und JSON-Dateien, erkennt das Format selbst. Ersetzt plutil.

ersetzt: plutil

Status: fertig (Mac)

ptx permindex fertig

Permutiertes Stichwortverzeichnis (Stichwort im Zusammenhang) erzeugen

ptx [-w BREITE] [-i IGNORIERLISTE] [-o NURLISTE] [-A] [-O | -T] [DATEI...]

statt ptx

mehr
-w
Zeilenbreite (Standard 72)
-i
Datei mit Wörtern, die nicht als Stichwort dienen (Füllwörter)
-o
Datei mit den einzigen erlaubten Stichwörtern
-A
Dateiname und Zeilennummer voranstellen
-O
Ausgabe als roff-Aufrufe (.xx)
-T
Ausgabe als TeX-Aufrufe (\xx)

ptx DATEI macht aus jedem Wort jeder Zeile einen Eintrag: links der Text davor (rechtsbündig), rechts das Stichwort mit dem Rest der Zeile; die Einträge sind nach Stichwort geordnet (ohne Rücksicht auf Groß-/Kleinschreibung). -w Breite (72), -i DATEI Füllwörter, die nicht als Stichwort gelten, -o DATEI nur diese Stichwörter, -A stellt Datei:Zeile: voran, -O und -T schreiben roff- bzw. TeX-Aufrufe (.xx "vorher" "Stichwort" "nachher" "Verweis"). Gekürzter Text ist mit / gekennzeichnet.

ersetzt: ptx

Status: fertig (Mac)

pv pipeview fertig

Fortschritt, Rate und Restzeit für Daten in Pipes anzeigen

pv [-q -n -f -L RATE -s GRÖSSE -N NAME] [DATEI...]

statt pipe_progress

mehr
-L
Rate begrenzen (Bytes/s, Endung k m g)
-s
erwartete Gesamtgröße (für Balken und Restzeit)
-N
Name vor der Anzeige
-n
nur Prozentzahlen, je Zeile (für Skripte)
-q
keine Anzeige
-f
Anzeige auch ohne Terminal

pv schiebt Daten unverändert von Dateien/stdin nach stdout und zeigt auf stderr Menge, Zeit, Rate, Balken und Restzeit:

ersetzt: pv, pipe_progress

Status: fertig (Mac)

rf roff fertig

Handbuchseiten (man, mdoc) für das Terminal setzen

rf [-b -s -w BREITE -man -mdoc] [DATEI...]

statt groff nroff troff mandoc soelim

mehr
-b
fett/kursiv per Überschreiben (c^Hc), für less und Drucker
-s
nur .so-Einbindungen auflösen (soelim)
-w
Zeilenbreite (Standard 78)
-man
Makropaket man erzwingen (sonst automatisch)
-mdoc
Makropaket mdoc erzwingen

rf DATEI setzt Handbuchseiten für das Terminal: man(7)- und mdoc(7)-Seiten (auch fremde, z. B. von macOS/BSD/Linux) werden lesbar mit Kopf, Fuß, Einrückungen, Listen und Umbruch ausgegeben. Ersetzt groff, nroff, troff, mandoc, soelim.

ersetzt: groff, nroff, troff, mandoc, soelim

Status: fertig (Mac)

rs reshape fertig

Text umformen: Spalten, Transponieren, Dateien zeilenweise zusammenlegen

rs [-t] [-c N] [-r N] [-s TRENNER] [-o TRENNER] [DATEI] | rs -l [-o TRENNER] DATEI...

statt lam

mehr
-c
N Felder auf N Spalten neu umbrechen
-r
N Felder auf N Zeilen verteilen
-t
transponieren (Zeilen und Spalten tauschen)
-s
Trenner der Eingabe (Standard: Leerraum)
-o
Trenner der Ausgabe (Standard: Leerzeichen)
-l
Dateien zeilenweise nebeneinander legen (lam)

Ersetzt rs (BSD) und lam. Liest eine Datei oder stdin (-).

ersetzt: rs, lam

Status: fertig (Mac)

rv reverse fertig

Jede Zeile zeichenweise umdrehen (mit -l: Zeilenreihenfolge)

rv [-l] [DATEI...]

statt rev tac

mehr
-l
Zeilen in umgekehrter Reihenfolge ausgeben (tac)

rv DATEI dreht jede Zeile zeichenweise um (rev); UTF-8-Zeichen bleiben heil, ein \r am Zeilenende bleibt am Ende. rv -l DATEI gibt die Zeilen in umgekehrter Reihenfolge aus (tac, liest die ganze Eingabe in den Speicher). Ohne Datei oder mit - wird die Standardeingabe gelesen. Zeilen beliebiger Länge.

ersetzt: rev

Status: fertig (Mac)

sf shuffle fertig

Zeilen zufällig mischen oder auswählen

sf [-n ANZAHL] [-r] [-s SAMEN] [-i VON-BIS | -e WORT... | DATEI]

statt shuf jot random

mehr
-n
höchstens so viele Zeilen ausgeben
-r
mit Zurücklegen ziehen (ohne -n endlos)
-i
Zahlen VON-BIS mischen
-e
die Argumente statt Dateizeilen mischen
-s
festen Zufallssamen setzen (reproduzierbar)

sf DATEI gibt die Zeilen in zufälliger Reihenfolge aus (Fisher-Yates, gleichmäßig ohne Verzerrung). -n N nur N Zeilen, -i 1-10 mischt Zahlen, -e a b c mischt die Argumente, -r zieht mit Zurücklegen (ohne -n endlos), -s SAMEN macht die Folge reproduzierbar (für Tests). Ohne -s kommt der Samen aus /dev/urandom bzw. der Uhr.

ersetzt: shuf, jot, random

Status: fertig (Mac)

spc spell fertig

Rechtschreibung prüfen, mit Vorschlägen

spc [-l -w -q -z -v] [-d WÖRTERBUCH] [-p PERSÖNLICH] [-m N] [DATEI... | WORT...]

statt aspell hunspell

mehr
-l
nur die falschen Wörter, jedes einmal
-w
Argumente sind Wörter statt Dateien
-q
still (nur Rückgabewert)
-z
zusammengesetzte Wörter erlauben (bei de automatisch)
-v
Dateinamen und Zahl der Fehler zeigen
-d
Wörterbuch (Name, Textliste oder .spd-Datei)
-p
persönliche Wortliste
-m
höchstens N Vorschläge (5)
-b
Wörterbuch bauen: spc -b LISTE AUSGABE.spd
-a
Wörter an die persönliche Liste (-p) anhängen
-i
Wörterbuch-Info zeigen

spc DATEI... (oder Standardeingabe) zeigt falsch geschriebene Wörter als datei:zeile:spalte: wort → vorschlag, …. Ersetzt spell, aspell, hunspell.

ersetzt: aspell, hunspell, spell

Status: fertig (Mac)

spl split fertig

Datei in Stücke teilen (nach Zeilen, Bytes, Anzahl oder Textmarke)

spl [-l ZEILEN | -b BYTES | -n STÜCKE | -t TEXT] [-a LÄNGE] [-d] [DATEI [VORSATZ]]

statt split csplit

mehr
-l
Zeilen je Stück (Standard 1000)
-b
Bytes je Stück (Suffix k, m)
-n
in N gleich große Stücke (nur Dateien)
-t
neues Stück bei jeder Zeile, die TEXT enthält
-a
Länge der Endung (Standard 2)
-d
Zahlen statt Buchstaben als Endung

spl DATEI [VORSATZ] teilt eine Datei in Stücke xaa, xab, … (Standard: 1000 Zeilen je Stück). -l N Zeilen, -b N Bytes (Suffix k, m), -n N in N fast gleich große Stücke (nur echte Dateien), -t TEXT beginnt ein neues Stück bei jeder Zeile, die TEXT enthält (einfachste Form von csplit, ohne regulären Ausdruck). -a N Länge der Endung, -d Ziffern statt Buchstaben. Ohne Datei oder mit - wird die Standardeingabe geteilt. Bleiben die Endungen aus, bricht spl mit Fehler ab. Zusammenfügen: cat xa*.

ersetzt: split, csplit

Status: fertig (Mac)

ts timestamp fertig

Zeitstempel vor jede Eingabezeile setzen

ts [-i | -s] [-m] [-u] [FORMAT]
mehr
-i
Zeit seit der vorigen Zeile statt Uhrzeit
-s
Zeit seit Programmstart statt Uhrzeit
-m
monotone Uhr benutzen (für -i und -s)
-u
Uhrzeit in UTC statt Ortszeit

befehl | ts [-i | -s] [-m] [-u] [FORMAT] setzt vor jede Eingabezeile einen Zeitstempel (Ersatz für ts aus moreutils).

ersetzt: ts

Status: fertig (Mac)

tso toposort fertig

Aus Paaren "A vor B" eine Reihenfolge herstellen (topologisch sortieren)

tso [DATEI]

statt tsort

mehr

tso DATEI liest Paare von Namen („A B“ = A muss vor B kommen; Trenner sind beliebige Leerzeichen und Zeilenumbrüche) und schreibt alle Namen in einer passenden Reihenfolge, einen je Zeile. Unter mehreren möglichen Knoten kommt der zuerst genannte zuerst. Ein Paar A A legt nur den Knoten an. Bei einem Zyklus meldet tso die beteiligten Namen auf stderr, gibt trotzdem alle Namen aus und endet mit 1. Eine ungerade Anzahl Namen ist ein Fehler.

ersetzt: tsort

Status: fertig (Mac)

uif unifdef fertig

#if-Blöcke auflösen: gewählte Zweige behalten, Rest entfernen

uif [-D SYM[=WERT] -U SYM -l -i -o DATEI] [DATEI...]

statt unifdef

mehr
-D
Symbol als definiert annehmen (-DSYM = 1)
-U
Symbol als nicht definiert annehmen
-l
entfernte Zeilen als Leerzeilen lassen
-i
Dateien an Ort und Stelle ändern
-o
Ausgabe in DATEI schreiben

uif -DESP32 -UPC DATEI gibt den Quelltext aus, in dem alle Bedingungen, die sich mit den gegebenen Symbolen entscheiden lassen, aufgelöst sind: gewählte Zweige bleiben, andere samt #if/#else/#endif-Zeilen verschwinden. Unbekannte Bedingungen bleiben unverändert (#elif nach einem unbekannten Kopf wird bei Bedarf zu #if). Nützlich, um gerätespezifischen Code (ESP32 gegen PC) herauszuschneiden.

ersetzt: unifdef

Status: fertig (Mac)

vis visible fertig

Steuerzeichen und Binärbytes sichtbar machen (und zurückwandeln)

vis [-t -e -u] [DATEI...]

statt cat-v unvis catv

mehr
-t
Tabs als ^I zeigen
-e
Zeilenende mit $ markieren
-u
zurückwandeln (^X und M-x wieder zu Bytes)

vis [-t -e -u] [DATEI...] zeigt Steuerzeichen und Binärbytes lesbar an: ^A für 0x01, ^? für 0x7f, M-x für Bytes ab 0x80 (wie cat -v). -t zeigt Tabs als ^I, -e markiert Zeilenenden mit $, -u wandelt zurück (ersetzt unvis). Ohne Datei oder mit - wird von der Standardeingabe gelesen.

ersetzt: cat -v, vis, unvis, catv

Status: fertig (Mac)

4. Prüfsummen, Kodierung, Binärdaten

dd blockcopy fertig

Blöcke kopieren und umwandeln

dd [if=DATEI] [of=DATEI] [bs=N] [count=N] [skip=N] [seek=N] [conv=notrunc,sync,noerror,ucase,lcase] [status=none]

statt dd diskcopy

mehr
bs=
Blockgröße (Suffix b k m g)
ibs=
Eingabeblock
obs=
Ausgabeblock
count=
nur N Blöcke lesen
skip=
N Eingabeblöcke überspringen
seek=
N Ausgabeblöcke überspringen
conv=
notrunc, sync, noerror, ucase, lcase
status=none
keine Zusammenfassung

dd if=QUELLE of=ZIEL bs=4k count=10 skip=2 seek=1 conv=notrunc,sync,noerror,ucase,lcase status=none. Operanden wie bei dd (Linux/macOS); Größen mit Suffix b (512), k, m, g. Ohne if=/of= gelten Standardeingabe/-ausgabe. Am Ende steht eine Zusammenfassung (Blöcke voll+teilweise, Byte) auf stderr. ibs/obs einzeln möglich (höchstens 64 KB). skip springt per lseek, bei Pipes durch Lesen.

ersetzt: dd, diskcopy, diskcomp, DISKCOPY

Status: fertig (Mac)

en encode fertig

Daten kodieren und dekodieren (base64, base32, base16, url, uu)

en [-d] [-f base64|base32|base16|url|uu] [-w BREITE] [DATEI]

statt base64 base32 basenc uuencode uudecode

mehr
-d
dekodieren statt kodieren
-f
Format (Standard base64)
-w
Zeilenbreite beim Kodieren, 0 = keine Umbrüche (Standard 76)

en DATEI gibt die Datei als base64 aus, en -d DATEI macht es rückgängig. Ohne DATEI (oder mit -) wird von der Standardeingabe gelesen. Formate mit -f: base64 (Standard), base32, base16 (hex), url (base64url ohne =) und uu (uuencode, beim Dekodieren wird begin/end beachtet). -w N setzt die Zeilenbreite (Standard 76, 0 = eine Zeile).

ersetzt: base64, certutil -encode/-decode, base32, basenc, uuencode, uudecode

Status: fertig (Mac)

he hexedit fertig

Dateien als Hex und Text ansehen und Bytes ändern

he [-r] [+POSITION] DATEI

statt hexedit

mehr
-r
nur lesen

he DATEI zeigt eine Datei als Hex und Text und überschreibt einzelne Bytes. Ersetzt hexedit. Große Dateien werden nicht geladen: gelesen wird seitenweise per Seek, Änderungen liegen im Speicher und gehen erst mit ^S in die Datei. Die Dateigröße bleibt gleich (nur Überschreiben).

ersetzt: hexedit, xxd -r

Status: fertig (Mac)

hs checksum fertig

Prüfsummen berechnen und prüfen (SHA-256, SHA-512, SHA-1, MD5, SHA3-256, BLAKE2b, BLAKE3, CRC-32)

hs [-a VERFAHREN] [-c] [-q] [-l] [DATEI...]

statt cksum md5sum sha1sum sha256sum sha512sum b2sum sha3sum shasum

mehr
-a
Verfahren: sha256 (Standard), sha512, sha1, md5, sha3-256, blake2b, blake3, crc32
-c
Summen aus den Dateien prüfen statt berechnen
-q
beim Prüfen nur Fehler zeigen
-l
alle Verfahren auflisten

hs DATEI... zeigt die SHA-256-Summe jeder Datei, ohne Datei die der Eingabe. Ausgabe wie sha256sum: SUMME NAME. hs -a VERFAHREN wählt ein anderes Verfahren, hs -l listet alle auf:

ersetzt: cksum, crc32, sum, md5sum, md5, certutil -hashfile MD5, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shasum, certutil -hashfile, sha1sum … sha512sum, sha1, sha256, sha512, sha3sum, b2sum

Status: fertig (Mac)

ph passhash fertig

Passwort-Hashes im crypt-Format ($1$, $5$, $6$) erzeugen und prüfen

ph [-m md5|sha256|sha512] [-s SALZ] [-r RUNDEN] [PASSWORT] | ph -c HASH [PASSWORT]

statt mkpasswd cryptpw

mehr
-m
Verfahren: md5 ($1$), sha256 ($5$), sha512 ($6$, Standard)
-s
Salz vorgeben (sonst zufällig)
-r
Runden für sha256/sha512 (1000 bis 999999999, Standard 5000)
-c
Passwort gegen diesen Hash prüfen (Rückgabe 0 = stimmt)

ph PASSWORT gibt einen gesalzenen SHA-512-crypt-Hash ($6$salz$…) aus, wie er in /etc/shadow steht; -m sha256 macht $5$…, -m md5 macht $1$… (nur für alte Systeme), -s SALZ gibt das Salz vor (sonst zufällig aus /dev/urandom), -r N setzt die Rundenzahl für sha256/sha512 (Standard 5000, dann ohne rounds= im Hash). ph -c HASH PASSWORT prüft ein Passwort gegen einen Hash (Rückgabe 0 = stimmt). Ohne Passwort-Argument wird die erste Zeile der Standardeingabe gelesen (so steht es nicht in der Prozessliste).

ersetzt: mkpasswd, cryptpw, openssl passwd

Status: fertig (Mac)

pwg pwgen fertig

Zufällige Passwörter und Merksätze (aus Wortliste) erzeugen

pwg [-c ANZAHL] [-l LÄNGE] [-s] [-0] [-A] [-p] [-w WORTLISTE [-k WÖRTER]]

statt pwgen

mehr
-c
so viele Passwörter (Standard 1)
-l
Länge (Standard 16)
-s
auch Sonderzeichen
-0
keine Ziffern
-A
keine Großbuchstaben
-p
aussprechbar (Konsonant-Vokal)
-w
stattdessen Wörter aus der Liste mit - verbinden
-k
Anzahl Wörter (Standard 4)

pwg gibt ein zufälliges Passwort mit 16 Zeichen aus, -c N mehrere, -l N die Länge (4 bis 200). Jedes Passwort enthält mindestens einen Klein- und Großbuchstaben und eine Ziffer; verwechselbare Zeichen (l I O 0 1) fehlen. -s nimmt Sonderzeichen dazu und verlangt eines, -0 lässt Ziffern weg, -A Großbuchstaben, -p erzeugt aussprechbare Passwörter (Konsonant–Vokal). -w WORTLISTE [-k N] gibt stattdessen N zufällige Wörter (Standard 4) mit - verbunden aus (Merksatz); die Liste hat ein Wort je Zeile.

ersetzt: pwgen

Status: fertig (Mac)

rnd random fertig

Zufallszahlen und Zufallsbytes ausgeben

rnd [-n ANZAHL] [-f] [-x BYTES] [-s SAMEN] [[VON] BIS]

statt random mcookie

mehr
-n
so viele Werte ausgeben (Standard 1)
-f
Kommazahl zwischen 0 und 1
-x
Zufallsbytes als Hexzeichen (16 Bytes = mcookie)
-s
festen Samen setzen (reproduzierbar)

rnd BIS gibt eine ganze Zufallszahl von 0 bis BIS−1 aus, rnd VON BIS eine von VON bis BIS (beide eingeschlossen), ohne Argumente 0 bis 2147483647. -n N gibt N Werte aus, -f Kommazahlen in 0,1), -x N N Zufallsbytes als Hex (rnd -x 16 ersetzt mcookie), -s SAMEN macht die Folge reproduzierbar. Gleichverteilt ohne Modulo-Verzerrung.

ersetzt: mcookie, shuf -i, $RANDOM, jot -r, %RANDOM%, shuf, random

Status: fertig (Mac)

str strings fertig

Druckbare Zeichenfolgen in Binärdateien finden

str [-n LÄNGE] [-t d|o|x] [-f] [DATEI...]

statt strings

mehr
-n
Mindestlänge (Standard 4)
-t
Versatz davor ausgeben: d dezimal, o oktal, x hex
-f
Dateinamen vor jede Zeile
-a
ganze Datei durchsuchen (ist ohnehin so)

str DATEI... gibt alle Folgen von mindestens 4 druckbaren Zeichen aus (strings). -n N ändert die Mindestlänge, -t d|o|x schreibt den Versatz (dezimal, oktal, hex) davor, -f den Dateinamen. Ohne Datei oder mit - wird die Standardeingabe gelesen; bei mehreren Dateien steht der Name automatisch davor.

ersetzt: strings

Status: fertig (Mac)

uc charinfo fertig

Zeichen nachschlagen: Codepunkt, UTF-8-Bytes, Art, Block; ASCII-Tabelle

uc [-a] [-s] ZEICHEN | U+XXXX | 0xXX | #DEZ ...

statt unicode ascii

mehr
-a
ASCII-Tabelle ausgeben
-s
Zeichenketten Zeichen für Zeichen auflisten

uc € oder uc U+20AC (auch 0x20AC, #8364) zeigt Codepunkt, das Zeichen, die UTF-8-Bytes, die Art (Großbuchstabe, Ziffer, Symbol …) und den Unicode-Block. uc -s "aä€" listet eine Zeichenkette Zeichen für Zeichen, uc -a gibt die ASCII-Tabelle (dezimal, hex, oktal, Zeichen oder Steuerkürzel).

ersetzt: unicode, ascii

Status: fertig (Mac)

uu uuid fertig

UUIDs erzeugen (Version 1, 3, 4, 5, 7) und lesen

uu [-1 | -3 NR NAME | -4 | -5 NR NAME | -7 | -0 | -m] [-c ANZAHL] [-u] [-x] | uu -p UUID...

statt uuidgen uuidparse

mehr
-4
zufällige UUID (Standard)
-7
zeitgeordnete UUID (Millisekunden + Zufall)
-1
zeitbasierte UUID mit Zufallsknoten
-3
Namens-UUID mit MD5 (Namensraum dns, url, oid, x500 oder UUID)
-5
Namens-UUID mit SHA-1
-0
nil-UUID (alles 0)
-m
max-UUID (alles 1)
-c
so viele ausgeben
-u
Großbuchstaben
-x
ohne Bindestriche
-p
UUIDs lesen und Version, Variante, Zeit zeigen

uu gibt eine zufällige UUID (Version 4) aus. -7 zeitgeordnet (Version 7, Millisekunden + Zufall, sortiert sich beim Anlegen), -1 zeitbasiert (Version 1 mit Zufallsknoten statt MAC-Adresse), -3 NR NAME und -5 NR NAME Namens-UUIDs mit MD5/SHA-1 (NR = dns, url, oid, x500 oder eine UUID), -0 nil, -m max. -c N gibt N aus, -u Großbuchstaben, -x ohne Bindestriche. uu -p UUID... liest UUIDs und zeigt Version, Variante und – bei Version 1 und 7 – die Zeit (uuidparse).

ersetzt: uuidgen, uuidparse

Status: fertig (Mac)

6. Shell-Hilfsprogramme und Skripting

buf stdbuf teilweise

Befehl mit geänderter Pufferung von Ein- und Ausgabe starten

buf [-i MODUS] [-o MODUS] [-e MODUS] BEFEHL [ARG...]

statt stdbuf

mehr
-i
Pufferung der Standardeingabe
-o
Pufferung der Standardausgabe
-e
Pufferung der Fehlerausgabe

buf -oL befehl startet den Befehl so, dass seine Ausgabe zeilenweise statt blockweise gepuffert wird (-o0 gar nicht, -o 64K mit dieser Größe; ebenso -i und -e). Nützlich in Pipes: buf -oL tail -f log | grep fehler.

ersetzt: stdbuf

Status: teilweise

ca calculate fertig

Rechnen: Ganzzahlen und Dezimalzahlen beliebiger Größe, Variablen, Funktionen

ca [-s STELLEN -x -b -o -e] [AUSDRUCK...]

statt expr bc dc calc

mehr
-s
Nachkommastellen bei Division und Funktionen (Standard 20, mit -e 0)
-x
Ergebnis hexadezimal ausgeben (0x…)
-b
Ergebnis binär ausgeben (0b…)
-o
Ergebnis oktal ausgeben (0o…)
-e
expr-Verträglichkeit: ganzzahlig, = und | & wie expr, Exitcode 1 bei Ergebnis 0

ca 2+3*4 gibt 14 aus. Ohne Argument startet der Rechner interaktiv (Zeile für Zeile, auch aus einer Pipe: echo 2+3 | ca). Beenden mit q.

ersetzt: expr, set /a, bc, dc

Status: fertig (Mac)

dlg dialog teilweise

Einfache Dialoge für Skripte (Hinweis, Ja/Nein, Eingabe, Menü)

dlg [--title T] msg|yesno|input|pass|menu|check TEXT [ARG...]

statt dialog whiptail bsddialog

mehr

Der Dialog erscheint als Textrahmen auf der Standardausgabe, das Ergebnis geht auf die Standardfehlerausgabe (wie dialog), Rückgabe 255 bei Ende der Eingabe. Antwort wird zeilenweise eingegeben (Nummer oder Tag; j/n), --title T setzt eine Überschrift, langer Text wird umbrochen, \n im Text macht eine neue Zeile. pass blendet die Eingabe aus.

ersetzt: dialog, whiptail, bsddialog

Status: teilweise

ev env fertig

Umgebungsvariablen zeigen, ändern oder Programm damit starten

ev [-i -0 -g] [-u NAME] [NAME=WERT...] [BEFEHL [ARG...]]

statt env printenv

mehr
-i
mit leerer Umgebung starten
-u
Variable NAME entfernen
-g
nur die Werte der genannten Variablen ausgeben (printenv)
-0
Ausgabe mit NUL statt Zeilenumbruch beenden

ev zeigt die Umgebungsvariablen. ev NAME=WERT… BEFEHL startet den Befehl mit geänderter Umgebung, -i mit leerer, -u NAME entfernt eine Variable, -g NAME… gibt nur Werte aus (wie printenv), -0 trennt mit NUL.

ersetzt: env, printenv, set, /etc/environment, launchctl setenv, setx

Status: fertig (Mac)

exp expect teilweise

Interaktive Programme automatisch bedienen (warten, antworten)

exp [-t SEK] [-T SEK] [-q] [-e MUSTER | -s TEXT | -w SEK]... [-f SKRIPT] [--] BEFEHL [ARG...]

statt expect

mehr
-e
auf diesen Text in der Ausgabe warten
-s
Text senden (\n \r \t \e \cX)
-w
Sekunden pausieren
-f
Schritte aus Skript (Zeilen: expect TEXT, send TEXT, sleep SEK)
-t
Frist je -e in Sekunden (Standard 10)
-T
Gesamtfrist bis zum Ende des Programms (Standard 60)
-q
Ausgabe des Programms nicht mitzeigen

exp startet das Programm an einem Pseudo-Terminal, zeigt seine Ausgabe, wartet bei -e TEXT bis der Text in der Ausgabe erscheint (Frist -t, Standard 10 s), sendet bei -s TEXT (\n \r \t \e \cC), pausiert bei -w SEK. Danach läuft das Programm zu Ende (Gesamtfrist -T); der Rückgabewert ist der des Programms. Zeitüberschreitung: 124, Programm endet vor dem Muster: 1, falscher Aufruf: 2. Skriptdatei: Zeilen expect TEXT, send TEXT, sleep SEK, # für Kommentare.

ersetzt: expect

Status: teilweise

gc getconf fertig

Systemgrenzen und feste Werte zeigen

gc NAME... | gc -a

statt getconf pagesize

mehr
-a
alle bekannten Werte zeigen

gc NAME… gibt feste Systemwerte aus: PAGESIZE, NPROCESSORS_ONLN, PATH_MAX, NAME_MAX, ARG_MAX, LINE_MAX, PIPE_BUF, CHAR_BIT, INT_MAX, LONG_BIT u. a.; gc -a zeigt alle. PATH liefert den Standardsuchpfad. Unbekannter Name: eine Zeile Fehler, Rückgabe 1.

ersetzt: getconf, getconf PAGESIZE, pagesize

Status: fertig (Mac)

gt gettext fertig

Text in der eingestellten Sprache ausgeben

gt [-d BEREICH] [-e] [-s] TEXT [TEXT-MEHRZAHL ANZAHL]

statt gettext ngettext

mehr
-d
Übersetzungsbereich (Standard messages)
-e
Escape-Folgen (\n \t) im Ergebnis auswerten
-s
ohne abschließenden Zeilenumbruch

gt Hello gibt die Übersetzung aus, wenn für die eingestellte Sprache (LANGUAGE, LC_ALL, LC_MESSAGES, LANG) ein Katalog da ist, sonst den Originaltext. gt '%d file' '%d files' 3 wählt die Mehrzahl (wie ngettext). Kataloge sind Textdateien im PO-Format (msgid, msgstr, msgid_plural, msgstr[N], Fortsetzungszeilen, Plural-Forms: für „n != 1“, „n > 1“, nur eine Form, slawisch) unter /usr/share/locale/SPRACHE/LC_MESSAGES/BEREICH.po (GT_DIR, -d BEREICH); de_DE fällt auf de zurück. Mit -e werden \n und \t im Ergebnis ausgewertet.

ersetzt: gettext, ngettext, gencat

Status: fertig (Mac)

lc locale fertig

Spracheinstellungen und Zeichensatz zeigen

lc [-a | -m | -c]

statt locale

mehr
-a
vorhandene Sprachumgebungen
-m
vorhandene Zeichensätze
-c
aktuellen Zeichensatz zeigen

lc zeigt LANG und die LC_…-Kategorien wie locale: in Anführungszeichen, wenn der Wert nur geerbt ist (aus LC_ALL bzw. LANG), ohne, wenn die Variable selbst gesetzt ist. lc -a listet vorhandene Umgebungen (C, C.UTF-8, POSIX), lc -m die Zeichensätze (ASCII, UTF-8), lc -c den aktuellen.

ersetzt: locale, localedef

Status: fertig (Mac)

lv leave fertig

Rechtzeitig ans Gehen erinnern

lv [-k N] ZEIT

statt leave

mehr
-k
nach dem Zeitpunkt N Mal nachhaken (Standard 10, jede Minute)

lv 1730 (oder lv 17:30, lv +15 für in 15 Minuten) wartet im Vordergrund oder Hintergrund (lv 1730 &) und meldet sich 5 Minuten vorher, 1 Minute vorher und zur Zeit mit „Zeit zu gehen!“ samt Klingelzeichen, danach jede Minute noch bis zu zehnmal (-k N ändert das). Liegt die Uhrzeit schon hinter uns, gilt der nächste Tag.

ersetzt: leave

Status: fertig (Mac)

lw logwrite fertig

Zeile ins Systemprotokoll schreiben

lw [-t TAG] [-p STUFE] [-f DATEI] [-s] [TEXT...]

statt logger

mehr
-t
Kennzeichen (Standard: Benutzername)
-p
Stufe: debug info notice warn err crit alert emerg
-f
Protokolldatei (Standard $LW_LOG, sonst /var/log/messages)
-s
zusätzlich auf stderr ausgeben

lw TEXT… hängt eine Zeile 2026-10-28 19:30:00 kennzeichen[pid] stufe: text an die Protokolldatei an (/var/log/messages, anders per -f DATEI oder Umgebung LW_LOG). -t Kennzeichen, -p Stufe (debug info notice warn err crit alert emerg), -s zusätzlich auf stderr. Ohne Text liest lw Zeilen von der Standardeingabe (befehl | lw -t mein).

ersetzt: logger, eventcreate, systemd-cat, log

Status: fertig (Mac)

opt getopt fertig

Optionen in Shell-Skripten zerlegen und quoten

opt [-l LANG,LANG:] [-q] OPTIONEN [ARG...]

statt getopt

mehr
-l
Langoptionen, Komma getrennt, ":" = Wert nötig, "::" = Wert optional
-o
Kurzoptionen angeben (sonst erstes Argument)
-q
Fehlermeldungen unterdrücken

Für Shell-Skripte: eval set -- "$(opt ab:c "$@")" zerlegt Kurzoptionen (-abc, -bWERT, -b WERT), sortiert Nicht- Optionen nach hinten und quotet alles sicher. Wert nötig: b:; optional (nur angehängt): b::. Führendes + (oder POSIXLY_CORRECT) hört bei der ersten Nicht-Option auf. Langoptionen mit -l lang,wert:,opt:: (eindeutiger Anfang genügt, --wert=5 oder --wert 5). Fehler: eine Zeile nach stderr, Ausgabe endet trotzdem mit --, Rückgabe 1; -q still.

ersetzt: getopt

Status: fertig (Mac)

osa scripthost fertig

Skript starten: Interpreter nach #!-Zeile oder Endung (s, py, bas, lua, js, awk)

osa [-v -q -n] [-l SPRACHE] [-e CODE | DATEI [ARG...]]

statt osascript cscript wscript

mehr
-l
Sprache oder Interpreter erzwingen (z. B. py, lua)
-e
Code von der Kommandozeile statt Datei (braucht -l)
-v
den Interpreter-Aufruf zeigen
-n
nur zeigen, was gestartet würde
-q
still

Ein kleiner Starter für Skripte in jeder Sprache: osa DATEI [ARG...] sucht den Interpreter selbst aus. Reihenfolge: -l SPRACHE, dann die #!-Zeile (auch #!/usr/bin/env [-S] name), dann die Dateiendung.

ersetzt: osascript, osacompile, cscript, wscript

Status: fertig (Mac)

rp runparts fertig

Alle ausführbaren Programme eines Ordners der Reihe nach starten

rp [-t] [-r] [-a ARG]... ORDNER

statt run-parts

mehr
-t
nur zeigen, was laufen würde
-r
rückwärts (für Abschalt-Skripte)
-a
Argument an jedes Programm übergeben (mehrfach möglich)

rp /etc/start.d startet alle ausführbaren Dateien des Ordners in Namensreihenfolge (10-erste, 20-zweite, …). Nur Namen aus Buchstaben, Ziffern, _ und - zählen (also nicht datei.alt oder ~-Sicherungen). -t zeigt nur, -r läuft rückwärts, -a ARG reicht Argumente durch. Ein Fehlschlag eines Programms stoppt die übrigen nicht; rp meldet ihn und gibt am Ende 1 zurück.

ersetzt: run-parts

Status: fertig (Mac)

sl sleep fertig

Warten

sl ZEIT...

statt sleep usleep

mehr

sl 1.5 wartet anderthalb Sekunden. Einheiten: ms, s (Standard), m, h, d; mehrere Angaben werden addiert: sl 2m 30s. Bei ungültiger Zeit Ausgabe in einer Zeile und Rückgabe 2.

ersetzt: sleep, timeout, ping -n, usleep

Status: fertig (Mac)

tm timeit fertig

Laufzeit eines Befehls messen

tm [-q] BEFEHL [ARG...]

statt time

mehr
-q
nur die Sekunden ausgeben

tm BEFEHL… führt den Befehl aus und schreibt danach Dauer 1.234s nach stderr (Ausgabe des Befehls bleibt unberührt). -q gibt nur die Sekunden aus. Der Exit-Code des Befehls wird weitergegeben.

ersetzt: time

Status: fertig (Mac)

to timeout fertig

Befehl nach einer Frist abbrechen

to [-s SIGNAL] [-k NACHFRIST] ZEIT BEFEHL [ARG...]

statt timeout

mehr
-s
Signal beim Ablauf (INT, TERM, KILL oder Zahl; Standard TERM)
-k
nach dieser Zeit zusätzlich hart beenden (KILL)

to ZEIT BEFEHL… startet den Befehl und beendet ihn mit SIGTERM, wenn er länger als ZEIT läuft. Zeit wie bei sl (ms s m h d). Rückgabe: Exit-Code des Befehls; 124 bei Ablauf; 137 wenn mit -k NACHFRIST zusätzlich hart beendet werden musste; 125 bei Fehler im Werkzeug; 127 Befehl nicht gefunden; 2 falscher Aufruf. -s SIGNAL wählt das Signal (INT, TERM, KILL, Zahl). ZEIT 0 heißt: kein Limit.

ersetzt: timeout

Status: fertig (Mac)

wa watch fertig

Befehl regelmäßig wiederholen und Ausgabe zeigen

wa [-n SEK] [-c ANZAHL] [-t -e -p] BEFEHL [ARG...]

statt watch cmdwatch

mehr
-n
Abstand in Sekunden (Standard 2)
-c
nach ANZAHL Durchläufen aufhören
-t
ohne Kopfzeile
-e
bei Fehler des Befehls aufhören
-p
Bildschirm nicht löschen

wa BEFEHL… führt den Befehl alle 2 Sekunden aus (-n SEK), zeigt oben „Alle 2s: Befehl Uhrzeit“ und löscht den Bildschirm nur, wenn die Ausgabe ein Terminal ist (in Pipes bleibt alles stehen). -c N nach N Durchläufen beenden, -e bei Fehler des Befehls beenden (Rückgabe = dessen Code), -t ohne Kopfzeile, -p nie löschen. Der Befehl läuft über sh -c. Ein einzelnes Argument gilt als Shell-Zeile (wa "ls | wc -l"); bei mehreren Argumenten werden Sonderzeichen gequotet (wa printf %s "a b").

ersetzt: watch, cmdwatch

Status: fertig (Mac)

7. Prozesse

acc accounting teilweise

Prozess-Abrechnung: letzte Befehle, Summen, Abrechnung ein/aus

acc [-f DATEI] [list [BEFEHL...]] | acc [-f DATEI] sum | acc [-f DATEI] add BEFEHL BENUTZER CPU_MS SPEICHER_KB EXIT | acc on DATEI | acc off

statt lastcomm sa accton

mehr
-f
Abrechnungsdatei (sonst $ACC_FILE, sonst /var/log/acct); steht vor dem Unterbefehl

Ersetzt lastcomm, sa und accton in einem Werkzeug.

ersetzt: lastcomm, sa, accton

Status: teilweise

af affinity teilweise

Prozess an bestimmte Prozessorkerne binden

af [-l -v -n] [-p PID] [MASKE] [BEFEHL...]

statt taskset cpuset

mehr
-l
Kerne auflisten
-p
vorhandenen Prozess zeigen oder umbinden
-v
Maske beim Start ausgeben
-n
nur zeigen, was gebunden würde

af MASKE BEFEHL... startet einen Befehl nur auf den genannten Prozessorkernen. af -p PID zeigt die Bindung eines laufenden Prozesses, af -p PID MASKE ändert sie. af -l listet die Kerne.

ersetzt: taskset, start /affinity, cpuset

Status: teilweise

cap capabilities teilweise

Fähigkeiten eines Prozesses anzeigen, ablegen, mit weniger starten

cap [-v -n -N -x] [-d LISTE | -k LISTE] [-c LISTE] [BEFEHL...]

statt setpriv capsh protect

mehr
-l
alle Fähigkeiten mit Erklärung auflisten
-d
LISTE ablegen (Komma-getrennt, z. B. net,dev)
-k
nur LISTE behalten, alles andere ablegen
-c
prüfen: Exit 0, wenn alle in LISTE gehalten werden
-N
keine neuen Rechte mehr erwerben (no-new)
-x
Kinder erben nichts (Erbmenge leer)
-n
Probelauf: zeigen, was gesetzt würde
-v
ausführlich

cap zeigt die Fähigkeiten des eigenen Prozesses, legt welche ab oder startet ein Programm mit weniger. Ersetzt setpriv, capsh und protect.

ersetzt: setpriv, capsh, proccontrol, protect

Status: teilweise

chr chroot fertig

Befehl mit anderem Wurzelordner ausführen

chr [-n] ORDNER [BEFEHL [ARG...]]

statt chroot

mehr
-n
nur prüfen und zeigen, was ausgeführt würde

chr ORDNER [BEFEHL …] führt den Befehl (Standard /bin/sh) so aus, dass ORDNER für ihn / ist. Vorher prüft chr, ob der Ordner existiert und ob der Befehl (bei absolutem Pfad) darin liegt – die übliche Falle bei chroot. -n prüft nur.

ersetzt: chroot

Status: fertig (Mac)

cor coredump teilweise

Speicherabbild (Core-Datei) zeigen oder schreiben

cor [-r -m] DATEI [ADRESSE [LÄNGE]] | cor -w DATEI | cor -g PID DATEI

statt gcore

mehr
-r
nur Register zeigen
-m
nur Speicherbereiche zeigen
-w
Probe-Abbild des eigenen Prozesses schreiben
-g
Abbild eines laufenden Prozesses ziehen (PID DATEI)

cor DATEI zeigt Programm, pid, Signal, Register und Speicherbereiche einer Core-Datei; -r nur Register, -m nur Bereiche; cor DATEI ADRESSE [LÄNGE] zeigt den Speicher dort als Hexdump. cor -w DATEI schreibt ein Probe-Abbild des eigenen Prozesses (Formattest). cor -g PID DATEI ruft plat_capture() (plat_nullos.c / plat_host.c) – dort bisher „nicht verfügbar“.

ersetzt: gcore

Status: teilweise

dm daemon fertig

Hintergrunddienst mit PID-Datei starten, stoppen, prüfen

dm start [-r] [-p PIDDATEI] [-o LOG] BEFEHL [ARG...] | dm stop|status [-p PIDDATEI] [NAME]

statt daemon start-stop-daemon

mehr
-r
Wächter: Befehl nach dem Ende neu starten (Pause wächst bei Abstürzen)
-p
PID-Datei (Standard /run/NAME.pid)
-o
Ausgabe und Fehler in diese Datei (anhängen)

- dm start [-p PIDDATEI] [-o LOG] BEFEHL … löst den Befehl vom Terminal (neue Sitzung, Ein- und Ausgabe weg bzw. in LOG), schreibt die PID-Datei und gibt die PID aus. Läuft er schon (PID-Datei mit lebendem Prozess), verweigert dm den zweiten Start. - -r setzt einen Wächter davor: endet der Befehl, startet er ihn neu (1 s, bei schnellen Abstürzen 1, 2, 4 … bis 30 s). Die PID-Datei nennt dann den Wächter. - dm stop schickt TERM, wartet bis 5 s, dann KILL, und löscht die PID-Datei. dm status → Rückgabe 0, wenn er läuft. - Ohne -p: /run/NAME.pid (beim Start NAME = Programmname).

ersetzt: daemon, start-stop-daemon, sc create

Status: fertig (Mac)

ini init fertig

erster Prozess: Dienste starten, am Laufen halten, Zombies wegräumen

ini [-n -v] [-c DATEI] [-d ORDNER] | ini -- BEFEHL [ARG...]

statt init tini

mehr
-c
Dienstliste (Standard /etc/ini)
-d
Zustandsordner für sv (Standard /run/ini)
-n
Dienstliste nur prüfen und zeigen
-v
Starts und Enden melden

ini liest eine Dienstliste (Standard /etc/ini), startet die Dienste, startet abgestürzte neu, räumt verwaiste Prozesse (Zombies) weg und fährt bei TERM/INT sauber herunter. Mit sv sieht und steuert man die Dienste.

ersetzt: init, systemd, launchd, tini, dumb-init, oneit

Status: fertig (Mac)

nh nohup fertig

Befehl unabhängig vom Terminal laufen lassen (auch im Hintergrund)

nh [-b -q] [-o DATEI|-] BEFEHL [ARG...]

statt nohup start

mehr
-b
im Hintergrund starten, Prozessnummer ausgeben, sofort zurückkehren
-o
Ausgabe in DATEI (anhängen); - = Ausgabe lassen
-q
keine Meldungen (keine PID bei -b)

nh BEFEHL … lässt den Befehl weiterlaufen, wenn das Terminal geschlossen wird (Auflegen/SIGHUP wird ignoriert). Ginge die Ausgabe aufs Terminal, landet sie in nh.out (angehängt); in Pipes und Dateien bleibt sie, wo sie ist.

ersetzt: nohup, start

Status: fertig (Mac)

ni nice fertig

Priorität: Befehl niedrig/hoch starten, laufende Prozesse ändern

ni [-n WERT] [-i] BEFEHL [ARG...] | ni -p WERT PID... | ni -s PID...

statt nice renice ionice taskpolicy

mehr
-n
Priorität (-20 hoch … 19 niedrig, oder niedrig, sehr-niedrig, normal, hoch); Standard 10
-i
auch Festplatten-Ein-/Ausgabe drosseln
-p
Priorität laufender Prozesse setzen
-s
Priorität laufender Prozesse zeigen

- ni BEFEHL … startet mit niedriger Priorität (10). ni -n 19 … / ni -n sehr-niedrig … ganz unten, ni -n hoch … (−10) braucht Administrator. - ni -i BEFEHL … drosselt zusätzlich die Festplatten-Ein-/Ausgabe (gut für Sicherungen, ionice -c3). - ni -p WERT PID… ändert laufende Prozesse (renice), ni -s PID… zeigt deren Wert.

ersetzt: nice, start /low … /high, renice, ionice, taskpolicy, iorenice

Status: fertig (Mac)

ns namespace teilweise

Befehl abgeschottet ausführen: ohne Netz, schreiben nur in einem Ordner

ns [-n] [-w ORDNER] BEFEHL [ARG...]

statt unshare jail firejail sandbox-exec nsenter

mehr
-n
kein Netzwerk (nur lokale Unix-Sockets)
-w
schreiben nur in diesem Ordner erlaubt

ns -n BEFEHL … führt einen Befehl ohne Netzwerk aus (IPv4 und IPv6, getestet auf 127.0.0.1 und ::1), ns -w ORDNER BEFEHL … erlaubt ihm Schreiben nur in ORDNER (Lesen überall). Beides zusammen ist ein einfaches Gefängnis für fremde Skripte oder Tests: ns -n -w /tmp/probe sh fremdes-skript.sh. Rückgabe ist die des Befehls; 125 = Abschottung nicht verfügbar.

ersetzt: nsenter, jexec, unshare, jail, lsns, jls

Status: teilweise

pers personality fertig

Architektur zeigen oder Befehl unter anderer Architektur starten

pers [ARCH BEFEHL [ARG...]]

statt arch setarch linux32 linux64

mehr

pers zeigt die Architektur, unter der es läuft (arm64, x86_64, mit „übersetzt mit Rosetta“, wenn ein Intel-Programm auf Apple Silicon läuft). pers x86_64 BEFEHL … startet einen Befehl als Intel-Programm (Universal-Programme über Rosetta), pers arm64 … nativ. Rückgabe ist die des Befehls.

ersetzt: setarch, linux32, linux64, arch

Status: fertig (Mac)

px procinfo fertig

alles über einen Prozess: Programm, Ordner, Befehl, Dateien, Umgebung, Speicher

px [-a -f -m -e -c] PID...

statt pmap vmmap pwdx procstat

mehr
-a
alles (Übersicht + offene Dateien)
-f
offene Dateien, Sockets, Rohre
-m
Speicherbereiche (wie pmap)
-e
Umgebungsvariablen
-c
nur Arbeitsordner (wie pwdx)

px PID zeigt Prozess, Eltern, Benutzer, nice, Programmdatei, Arbeitsordner, Befehlszeile, Startzeit, Speicher, Threads und CPU-Zeit. Dazu wahlweise:

ersetzt: pmap, vmmap, procstat -v, pwdx, procstat -f, /proc, procstat

Status: fertig (Mac)

rds sessions fertig

Anmelde-Sitzungen (Konsole, SSH) zeigen und beenden

rds [-q -n] [-i DATEI] [-e SITZUNG]

statt qwinsta

mehr
-q
nur die Anzahl ausgeben
-n
mit -e: nur zeigen, was beendet würde
-i
Sitzungen aus Textdatei lesen (Test)
-e
Sitzung beenden (TTY, Benutzer oder Prozessnummer)

rds listet angemeldete Sitzungen: Benutzer, Terminal, Art (konsole/ssh), Herkunft, Anmeldezeit, Prozessnummer. rds -q gibt nur die Anzahl aus, rds -e SITZUNG beendet eine (TTY, Benutzer oder Prozessnummer), -n probt nur. Ersetzt qwinsta, rwinsta, query session, tscon.

ersetzt: qwinsta, rwinsta, query session, tscon, tsdiscon, change logon/port/user, query, reset session

Status: fertig (Mac)

sch sched teilweise

Scheduling-Klasse und Priorität anzeigen oder setzen

sch [-l -n] [-p PID] [KLASSE[:PRIO] [BEFEHL...]]

statt chrt rtprio uclampset

mehr
-l
Klassen und Prioritätsbereiche zeigen
-p
vorhandenen Prozess ansehen/ändern (PID)
-n
nur zeigen, was passieren würde

Ersetzt chrt (Klasse), rtprio (Echtzeit-Priorität), uclampset (Auslastungsgrenzen; siehe Wünsche). Eine Ausgabe, ein Format: klasse prio. Ohne Prio gilt: normal 0, idle 19, Echtzeit niedrigste Stufe.

ersetzt: chrt, rtprio, uclampset, coresched

Status: teilweise

swr switchroot teilweise

vom Start-Dateisystem auf die echte Wurzel umschalten und dort ini starten

swr [-n -f] NEUE-WURZEL [INIT [ARG...]]

statt switch_root pivot_root

mehr
-n
nur prüfen
-f
auch wenn nicht Prozess 1

Beim Start läuft nullos aus einem RAM-Dateisystem (\nullos\init.img). Ist die echte Platte eingehängt, schaltet swr /neu dorthin um: wechselt die Wurzel und ersetzt sich durch /bin/ini (oder INIT …) der neuen Wurzel.

ersetzt: pivot_root, switch_root, reboot -r

Status: teilweise

trc trace teilweise

Befehl beobachten: Laufzeit, CPU, Speicher, I/O, benutzte Dateien

trc [-f -q] [-o DATEI] BEFEHL [ARG...]

statt strace dtruss ltrace fs_usage truss

mehr
-f
offene Dateien und Netzverbindungen mitschreiben (abgetastet)
-o
Bericht in DATEI statt auf die Fehlerausgabe
-q
keinen Bericht (nur Rückgabe)

trc BEFEHL … führt den Befehl aus und berichtet danach (auf die Fehlerausgabe oder mit -o in eine Datei):

ersetzt: strace, ltrace, dtruss, fs_usage, truss, ktrace, kdump

Status: teilweise

wp waitpid fertig

warten, bis Prozesse enden (auch fremde)

wp [-a -v] [-t SEK] PID...

statt pwait waitpid

mehr
-a
zurück, sobald der erste endet
-v
jedes Ende melden
-t
höchstens so lange warten (Rückgabe 1, wenn Zeit um)

wp 123 456 wartet, bis beide Prozesse beendet sind – auch solche, die nicht Kinder der Shell sind (das eingebaute wait kann nur Kinder). -a kehrt beim ersten Ende zurück, -v meldet jedes, -t 30 gibt nach 30 s auf (Rückgabe 1). Nicht (mehr) vorhandene Prozesse gelten als beendet. Beispiel: wp $(p -q mk) && pwr -s.

ersetzt: waitpid, pwait

Status: fertig (Mac)

8. Zeit, Datum, Planung

at atjob fertig

Befehle für später vormerken und ausführen

at [-f DATEI] ZEIT... | at -l | at -d NR... | at -x

statt at atq atrm batch

mehr
-l
vorgemerkte Aufträge auflisten (atq)
-d
Aufträge löschen (atrm)
-x
fällige Aufträge jetzt ausführen (ruft der Zeitplan-Dienst auf)
-f
Befehle aus Datei statt von der Standardeingabe

at ZEIT liest Befehle von der Standardeingabe (oder -f DATEI) und merkt sie für ZEIT vor, z. B. echo 'wa 5 sicherung' | at 03:00 tomorrow. Zeitangaben: 17:30 (nächste Gelegenheit), tomorrow 08:15, 2026-12-24 18:00, now + 2 hours, +10m (Einheiten s, min, h, d, w, auch ausgeschrieben, Mehrzahl egal). at -l listet (wie atq), at -d NR löscht (wie atrm), at -x führt alle fälligen Aufträge aus und löscht sie — das ruft der Zeitplan-Dienst (cr) jede Minute auf. Aufträge liegen als Dateien in /var/spool/at ($AT_SPOOL), jeder merkt sich Arbeitsordner und Befehle und läuft über sh.

ersetzt: at, atq, atrm, schtasks, batch

Status: fertig (Mac)

cal calendar fertig

Kalender anzeigen

cal [-3 -y -s -w] [[MONAT] JAHR]

statt cal ncal

mehr
-3
Vormonat, Monat und Folgemonat
-y
ganzes Jahr
-s
Woche beginnt am Sonntag
-w
Kalenderwochen anzeigen

cal zeigt den aktuellen Monat (Woche beginnt Montag), cal 12 2026 oder cal dezember 2026 einen bestimmten, cal 2027 das ganze Jahr (auch -y), -3 Vormonat/Monat/Folgemonat nebeneinander, -s Sonntag als Wochenanfang, -w mit Kalenderwochen (ISO 8601). Auf einem Terminal wird heute invers hervorgehoben. Monatsnamen deutsch oder englisch, ab drei Buchstaben. Proleptisch gregorianisch (keine Sonderbehandlung von 1752).

ersetzt: cal, ncal, ddate

Status: fertig (Mac)

cr cron fertig

Zeitplan-Dienst: Befehle zu festen Zeiten ausführen

cr [-t TABELLE] [-a] [-c N] [-s] | cr -l|-n|-1 [-t TABELLE] [-z "JJJJ-MM-TT HH:MM"]

statt cron crond crontab anacron

mehr
-t
Tabelle (Standard $CR_TAB, sonst /etc/crontab)
-l
Tabelle prüfen und Befehle auflisten
-n
nächste Ausführung je Eintrag zeigen
-1
einmal für die angegebene Minute ausführen (kein Dienst)
-z
statt der aktuellen Zeit diese Minute nehmen
-a
jede Minute auch fällige at-Aufträge ausführen
-c
Dienst nach N Minuten beenden (zum Testen)
-s
Dienst: sofort die erste Runde, nicht erst zur vollen Minute

cr liest eine Tabelle (/etc/crontab oder $CR_TAB, -t DATEI) und startet jede Minute die fälligen Befehle über sh -c. Zeilen: Minute Stunde Tag Monat Wochentag Befehl mit *, Listen 1,15, Bereichen 1-5, Schritten */10, Namen (jan, mon-fri; 0 und 7 = Sonntag) sowie @hourly @daily @weekly @monthly @yearly. NAME=Wert setzt eine Umgebungsvariable für alle folgenden Befehle. Sind Tag und Wochentag eingeschränkt, genügt eines von beiden (wie bei Vixie-cron). Die Tabelle wird jede Minute neu gelesen — Bearbeiten genügt, kein Neustart. Mit -a ruft cr jede Minute auch at -x auf (fällige at-Aufträge).

ersetzt: cron, crond, Taskplaner-Dienst, crontab, schtasks, anacron, systemd timer, periodic

Status: fertig (Mac)

nt ntp fertig

Uhrzeit von einem Zeitserver holen und abgleichen

nt [-s] [-q] [-p PORT] [-w SEK] SERVER

statt ntpdate sntp rdate w32tm chronyc

mehr
-s
die Systemuhr setzen (Administrator)
-q
nur die Abweichung in Sekunden ausgeben
-p
Port (Standard 123)
-w
Wartezeit auf Antwort in Sekunden (Standard 3)

nt SERVER fragt einen Zeitserver (SNTP, RFC 4330, UDP-Port 123) und zeigt die Abweichung der eigenen Uhr und die Laufzeit: pool.ntp.org: Abweichung +0.042 s, Laufzeit 0.021 s. -q gibt nur die Abweichung aus, -s setzt die Uhr (nur mit Administratorrechten), -p PORT und -w SEK ändern Port und Wartezeit. Rückgabe 1 bei Netzfehler, 2 bei falschem Aufruf.

ersetzt: ntpdate, chronyc, timedatectl, sntp, w32tm, ntpd, rdate, net time

Status: fertig (Mac)

rmd reminders teilweise

Termine und Erinnerungen für heute und die nächsten Tage zeigen

rmd [-f DATEI] [-d TAGE] [-t JJJJ-MM-TT]

statt calendar

mehr
-f
Terminedatei (Standard $RMD_FILE, sonst ~/.calendar/calendar)
-d
so viele Tage vorausschauen (Standard 1, freitags 3)
-t
statt heute dieses Datum nehmen

rmd liest ~/.calendar/calendar (anders: -f DATEI oder $RMD_FILE) und zeigt die Termine für heute und morgen (freitags bis Montag; -d 7 schaut eine Woche voraus). Zeilen: Datum, Tabulator oder Leerzeichen, Text; Zeilen, die mit Leerzeichen beginnen, gehören zum Termin davor. Datumsformen: 10/28, 28.10., 28.10, Oct 28, Okt 28, 28. Okt, Dezember 24 (deutsche und englische Monatsnamen), */28 (jeden Monat), 2026-10-30 (einmalig). # leitet Kommentare ein.

ersetzt: calendar

Status: teilweise

rtc hwclock teilweise

Hardware-Uhr lesen und mit der Systemzeit abgleichen

rtc [-u] | rtc -s | rtc -w

statt hwclock

mehr
-u
Zeit in UTC statt Ortszeit
-s
Systemzeit aus der Hardware-Uhr setzen
-w
Hardware-Uhr aus der Systemzeit schreiben

rtc zeigt die Hardware-Uhr (Ortszeit, -u in UTC). rtc -s setzt die Systemzeit aus ihr (beim Start), rtc -w schreibt die Systemzeit zurück in die Hardware-Uhr. Das Auslesen steckt in plat_host.c/plat_nullos.c.

ersetzt: hwclock, adjkerntz, rtcwake, pmset schedule, lsclocks

Status: teilweise

tz timezone teilweise

Zeitzone anzeigen, wählen und auflisten

tz | tz ZONE | tz -l [TEIL] | tz -t [ZONE]

statt timedatectl tzselect tzutil

mehr
-l
Zeitzonen auflisten (mit Suchteil filtern)
-t
aktuelle Uhrzeit in der Zone zeigen

tz zeigt die eingestellte Zeitzone, tz Europe/Berlin stellt sie ein (schreibt den Namen in /etc/timezone, $TZ_FILE), tz -l listet alle Zonen, tz -l berlin sucht, tz -t Asia/Tokyo zeigt die Uhrzeit dort (2026-10-28 20:00:00 JST +0900). Es werden nur echte Zonendateien (TZif) aus /usr/share/zoneinfo ($ZONEINFO) angenommen. Ohne Eintrag gilt die Umgebungsvariable TZ, sonst UTC.

ersetzt: timedatectl, tzselect, systemsetup -settimezone, tzutil, tzsetup, zic, zdump

Status: teilweise

wf waitfor fertig

Auf eine Datei, einen Prozess oder eine Uhrzeit warten

wf [-t SEK] [-g] file PFAD | wf [-t SEK] proc PID | wf [-t SEK] time HH:MM

statt waitfor

mehr
-t
höchstens so lange warten (Rückgabe 124 bei Ablauf)
-g
bei file: warten, bis die Datei verschwunden ist

wf file /tmp/fertig wartet, bis die Datei existiert (-g: bis sie verschwunden ist), wf proc 1234 bis der Prozess endet, wf time 17:30 bis zur Uhrzeit (heute). -t SEK begrenzt die Wartezeit; bei Ablauf Rückgabe 124 (wie to). Für Skripte: wf -t 30 file /run/netz.up && weiter.

ersetzt: waitfor

Status: fertig (Mac)

9. System: Info, Steuerung, Start/Stopp

ad directory teilweise

Verzeichnisdienst (LDAP): suchen, anmelden, anlegen, ändern, löschen

ad search|bind|info|add|mod|del [-H SERVER] [-D DN] [-w KENNWORT] [-b BASIS] [-s base|one|sub] [-z N] FILTER [ATTRIBUT...]

statt realm adcli dsconfigad netdom nltest gpupdate ldapsearch

mehr
-H
Server: host, host:port, IPv6]:port oder ldap://host:port (Standard localhost:389)
-D
Anmelde-DN (ohne: anonym)
-w
Kennwort (oder Umgebung AD_PASSWORD)
-b
Suchbasis
-s
Suchtiefe base, one oder sub (Standard sub)
-z
höchstens N Treffer

Ersetzt ldapsearch/ldapadd/ldapmodify/ldapdelete sowie – nur im LDAP-Teil – realm, adcli, dsconfigad, netdom, nltest, gpupdate.

ersetzt: realm, adcli, dsconfigad, netdom, nltest, dcdiag, gpupdate, gpresult, samba-tool, dcpromo, adprep, repadmin, dnscmd, ldapsearch, dscl, dsmemberutil, dsenableroot, dsquery

Status: teilweise

bo boot fertig

Startpartition prüfen und nullos darauf installieren

bo [ESP-ORDNER] | bo -i [-f -n] [-b NB.EFI] [-k NK.ELF] [-r INIT.IMG] ESP-ORDNER

statt bootctl efibootmgr bless bcdboot grub-install

mehr
-i
nullos installieren (Bootloader, Kernel, Startdaten kopieren)
-b
Bootloader (Standard build/nb.efi)
-k
Kernel (Standard build/nk.elf)
-r
Startdaten init.img
-f
fremden Bootloader überschreiben
-n
nur zeigen, was kopiert würde

bo ESP prüft eine eingehängte EFI-Startpartition (USB-Stick, Platte):

ersetzt: grub-install, efibootmgr, bootctl, bless, nvram, bcdedit, bcdboot, bootcfg, boot0cfg, bectl, sys, SYS, systemsetup -setstartupdisk

Status: fertig (Mac)

bta bootanalyze fertig

Startzeit-Protokoll von nb/nk auswerten: Zeitleiste, Rangliste, SVG-Diagramm

bta [-b -s -v] [DATEI]

statt systemd-analyze bootchart

mehr
-b
Rangliste: was hat am längsten gedauert
-s
SVG-Diagramm statt Text ausgeben
-v
auch Zeilen zeigen, die nicht erkannt wurden

Ersetzt systemd-analyze und bootchartd. bta [-b -s -v] [DATEI] liest ein Startprotokoll (Datei oder stdin, z. B. die serielle Ausgabe von QEMU) und zeigt:

ersetzt: systemd-analyze, bootchartd

Status: fertig (Mac)

cfg config fertig

Einstellungen lesen und ändern (eine Textdatei, Namen mit Punkten)

cfg [-f DATEI] [-n] [NAME | PRÄFIX | NAME=WERT... | -d NAME...]

statt defaults reg gsettings dconf getprop setprop sysrc

mehr
-f
andere Einstellungsdatei (Standard /etc/cfg oder $NCFG)
-d
Einträge löschen
-n
nur zeigen, was geändert würde

Alle Einstellungen von nullos stehen in einer Textdatei (/etc/cfg, anders mit -f oder NCFG), eine pro Zeile, Namen mit Punkten gegliedert:

ersetzt: dconf, gsettings, defaults, reg, regedit, regini, settings, setprop/getprop, sysrc, systemsetup, networksetup, msconfig, control, bsdconfig, scutil

Status: fertig (Mac)

cpu cpu fertig

Prozessor beschreiben: Name, Kerne und Kernarten, Caches, Merkmale

cpu [-q | -v]

statt lscpu nproc

mehr
-q
nur die Zahl der nutzbaren Kerne (wie nproc)
-v
zusätzlich alle Merkmale (Befehlssatzerweiterungen)

cpu -q gibt nur die Kernzahl aus (nproc, z. B. mk -j $(cpu -q)), cpu -v dazu alle Merkmale (ARM: FEAT_* ohne Vorsilbe, x86: machdep.cpu.features). Takt erscheint, wo das System ihn nennt (Intel-Macs; Apple Silicon nennt keinen).

ersetzt: chcpu, cpucontrol, lscpu, /proc/cpuinfo, sysctl machdep.cpu, wmic cpu, systeminfo, sysctl hw, dmesg, nproc, sysctl -n hw.ncpu, echo %NUMBER_OF_PROCESSORS%, sysctl hw.ncpu, iucode_tool

Status: fertig (Mac)

hn hostname fertig

Rechnername zeigen oder setzen

hn [-s | -d] [NEUER-NAME]

statt hostname hostnamectl dnsdomainname

mehr
-s
nur der kurze Name (bis zum ersten Punkt)
-d
nur die Domain (nach dem ersten Punkt)

hn zeigt den Rechnernamen, hn -s den kurzen Teil, hn -d die Domain. hn NAME setzt ihn (Administrator); erlaubt sind Buchstaben, Ziffern, - und ..

ersetzt: hostname, hostnamectl, scutil --set, hostid, dnsdomainname, domainname

Status: fertig (Mac)

kx kexec teilweise

neuen Kernel laden und ohne Firmware-Neustart hineinspringen (Schnellstart)

kx [-n -v] [-b DATEI] [-f DATEI] KERNEL [INITRD]

statt kexec

mehr
-n
nur prüfen und Übergabe zeigen, nicht springen
-v
Segmente einzeln auflisten
-b
Bootinfo-Vorlage (struct bootinfo) in DATEI schreiben
-f
flaches Abbild des Kernels (Segmente an ihrer Lage, bss genullt) in DATEI schreiben

kx [-n -v] [-b DATEI] [-f DATEI] KERNEL [INITRD]

ersetzt: kexec

Status: teilweise

mod module fertig

Kernel-Module und Treiber auflisten, laden, entladen

mod [-q] [MUSTER] | mod [-n] -l DATEI | mod [-n] -u NAME

statt lsmod modprobe insmod rmmod kextstat kextload kmutil kldload kldstat driverquery

mehr
-q
nur Namen
-l
Modul laden (Administrator)
-u
Modul entladen (Administrator)
-n
nur zeigen, was geladen/entladen würde

mod listet geladene Module (Name, Version, Größe, Verweise), mod apfs filtert (Teil des Namens), -q nur Namen. mod -l DATEI lädt, mod -u NAME entlädt (Administrator), -n zeigt nur.

ersetzt: modprobe, insmod, kextload, kmutil, kldload, rmmod, modprobe -r, kextunload, pnputil /delete-driver, kldunload, lsmod, kextstat, kmutil showloaded, driverquery, kldstat, modinfo, kextfind, driverquery /v, kldstat -v, depmod, kldxref, dkms, pnputil, drvloa

Status: fertig (Mac)

nv nvram fertig

Firmware-Variablen (NVRAM/EFI) zeigen und setzen

nv [-r -n] [NAME | NAME=WERT... | -d NAME...]

statt nvram efivar

mehr
-r
Werte roh (%xx nicht übersetzen)
-d
Variablen löschen (Administrator)
-n
nur zeigen, was gesetzt/gelöscht würde

nv listet die Variablen des Firmware-Speichers (NVRAM/EFI), nv NAME gibt einen Wert aus, nv NAME=WERT setzt, nv -d NAME löscht (beides Administrator, -n zeigt nur). %xx-Folgen werden zu lesbarem Text (Laptop ist verschlüsselt …), -r zeigt sie roh. Lange Werte werden in der Liste gekürzt.

ersetzt: efivar, efibootmgr, nvram, bcdedit /enum firmware

Status: fertig (Mac)

prf profile fertig

Laufzeit messen (stat) und Proben auswerten: Profil, Flammengrafik

prf stat [-r N] BEFEHL [ARG...] | prf rec [-f HZ] [-o DATEI] BEFEHL | prf top|fold|flame [-s SYMBOLE] [-b BASIS] [-n N] [-w BREITE] [-t TITEL] DATEI
mehr
-r
stat: N-mal ausführen, Mittel/Min/Max zeigen
-f
rec: Proben je Sekunde (Standard 997)
-o
rec: Probendatei (Standard prf.out)
-s
Symboltabelle (Zeilen "ADRESSE T NAME", wie nm)
-b
Ladeadresse von allen Probenadressen abziehen (PIE)
-n
top: nur die obersten N Funktionen (0 = alle)
-w
flame: Breite in Pixeln (Standard 1200)
-t
flame: Titel

Ersetzt perf, gprof, pmcstat, Instruments, time -v.

ersetzt: readprofile, perf, pmcstat, gprof, valgrind, instruments, sample, perf stat, sar, mpstat, powermetrics, typeperf, perfmon, logman, relog, systat, tracerpt, xperf, sxstrace

Status: fertig (Mac)

pwr power fertig

Strom: Akku zeigen, während eines Befehls wach bleiben, Ruhezustand

pwr [-q] | pwr -w BEFEHL [ARG...] | pwr [-n] -s

statt pmset caffeinate powercfg upower acpi systemd-inhibit

mehr
-q
nur Ladestand in Prozent (100 ohne Akku)
-w
Befehl ausführen und so lange keinen Ruhezustand zulassen
-s
jetzt in den Ruhezustand
-n
nur zeigen

- pwr -q nur der Ladestand (Skripte: [ $(pwr -q) -lt 20 ] && …; ohne Akku 100). - pwr -w BEFEHL … hält den Rechner wach, solange der Befehl läuft (lange Übersetzungen, Sicherungen); Rückgabe ist die des Befehls. - pwr -s schickt ihn in den Ruhezustand.

ersetzt: systemctl suspend, pm-suspend, powerprofilesctl, pmset, caffeinate, powercfg, zzz, acpiconf, powerd, systemd-inhibit, powercfg /requests, acpi, upower, pmset -g batt, powercfg /batteryreport, apm

Status: fertig (Mac)

sct sysctl fertig

Kernel-Einstellungen lesen und setzen

sct [-a -w -n] [-g MUSTER] [NAME[=WERT]...]

statt sysctl

mehr
-a
alle (Standard ohne NAME)
-w
nur Werte, ohne Namen
-g
nur Namen mit diesem Teil (Groß/klein egal)
-n
nur zeigen, was gesetzt würde

- sct listet alle Einstellungen (name: wert), sct hw einen Teilbaum, sct hw.ncpu kern.ostype einzelne. - sct -w NAME nur den Wert (für Skripte), sct -g perflevel sucht in den Namen. - sct NAME=WERT setzt (Zahl oder Text, Administrator), -n zeigt nur, was gesetzt würde.

ersetzt: sysctl

Status: fertig (Mac)

si sysinfo teilweise

Systembericht: System, CPU, Speicher, Laufwerke, Netz, Prozesse

si [-s system|cpu|speicher|laufwerke|netz|prozesse]

statt msinfo32 systeminfo

mehr
-s
nur diesen Abschnitt

Alles Wichtige auf einen Blick, -s ABSCHNITT nur einen Teil. Einzelheiten liefern die Fachwerkzeuge: sys, cpu, mem, sp, p/tp, pwr.

ersetzt: gnome-system-monitor, Systeminformationen, msinfo32

Status: teilweise

sv service teilweise

Dienste von ini zeigen, starten, stoppen, neu starten

sv [-d ORDNER] [-q] [NAME... | start|stop|restart NAME...]

statt service systemctl launchctl sc

mehr
-d
Zustandsordner von ini (Standard /run/ini)
-q
still; Rückgabe 0 = Dienst läuft

- sv listet alle Dienste, sv NAME zeigt einen (Rückgabe 0 nur, wenn er läuft; -q ohne Ausgabe). - sv start|stop|restart NAME… gibt ini den Auftrag und wartet bis 5 s, bis er ausgeführt ist. Ein gestoppter immer-Dienst bleibt gestoppt, bis sv start.

ersetzt: systemctl, service, rc-service, launchctl, sc, net start/stop, services.msc, sysrc, rcctl, runit, runsv, runsvdir, sv, chpst, runlevel, systemctl isolate, systemctl enable, update-rc.d, chkconfig, launchctl load, sc config, rcorder, systemd --user, autost

Status: teilweise

upd update fertig

System aktualisieren: nullos aus Release-Ordner, mit Rückweg

upd [-b ESP] [-n] [QUELLE] | upd [-b ESP] -i QUELLE | upd [-b ESP] -z | upd -m [-i]

statt softwareupdate apt-upgrade wuauclt freebsd-update syspatch

mehr
-b
Startpartition (Standard /boot auf nullos)
-i
installieren
-z
zurück zur vorigen Fassung
-m
Updates des Wirtssystems (macOS softwareupdate)
-n
nur zeigen

nullos wird als Ordner aktualisiert (ausgepacktes Release, USB-Stick, später Download) mit nb.efi, nk.elf, init.img, VERSION:

ersetzt: apt upgrade, dnf upgrade, softwareupdate, wuauclt, UsoClient, freebsd-update, syspatch

Status: fertig (Mac)

wdg watchdog teilweise

Wachhund: Prüfbefehl regelmäßig ausführen, bei wiederholtem Fehler handeln

wdg [-i SEK] [-f ANZAHL] [-a AKTION] [-n RUNDEN] [-q] PRÜFBEFEHL | wdg -s

statt watchdog wdctl watchdogd

mehr
-i
Abstand zwischen Prüfungen (Standard 10 s)
-f
so viele Fehler in Folge lösen die Aktion aus (Standard 3)
-a
Aktion (sh -c), z. B. "sv restart netz" oder "off -r -f"
-n
nur so viele Prüfungen
-q
keine Meldungen
-s
Zustand des Hardware-Wachhunds

wdg -i 30 -f 3 -a "sv restart netz" "ping -c 1 192.168.1.1" prüft alle 30 s; schlägt die Prüfung dreimal in Folge fehl, läuft die Aktion und gezählt wird von vorn. Ohne -a endet wdg an der Grenze mit 1 (dann kann ini oder ein Skript reagieren). Gemeldet werden nur Fehler und Erholung, mit Uhrzeit. Typisch in der Dienstliste von ini: wache immer wdg -i 60 -a "off -r -f" "p -q -x sld".

ersetzt: wdctl, watchdog, watchdogd

Status: teilweise

10. Hardware- und Treiber-Infos

bl blocks fertig

Datenträger, Partitionen und Dateisysteme auflisten

bl [-b -v -q] [BILD...]

statt lsblk blkid diskutil-list

mehr
-b
Größen genau in Bytes
-v
auch Kennungen (GPT-GUIDs, FAT-Seriennummer, MBR-Signatur)
-q
ohne Kopfzeile

- bl zeigt alle Datenträger als Baum: Größe, Inhalt (GPT, MBR, APFS-Container, Volume), Bezeichnung, Einhängepunkt. - bl BILD… zeigt Abbilder (oder später Geräte) mit Partitionstabelle, Partitionstyp, erkanntem Dateisystem und Bezeichnung – lsblk und blkid in einem. Erkannt werden FAT12/16/32, exFAT, NTFS, ext2/3/4, HFS+, APFS, ISO 9660, Linux-Swap, btrfs und (vorgemerkt) nullos. -v zeigt GPT-GUIDs, FAT-Seriennummern, MBR-Signatur. - Ein ! hinter GPT heißt: Haupt- oder Ersatzkopf defekt (part BILD fix).

ersetzt: lsblk, diskutil list, diskpart list disk, wmic diskdrive, geom disk list, camcontrol devlist, blkid, findfs, diskutil info, vol, fsutil fsinfo, fstype, fstyp, blockdev

Status: fertig (Mac)

bp beep fertig

Ton ausgeben (PC-Lautsprecher, am Mac Terminalklingel)

bp [-q -n] [HZ [MS [ANZAHL]]]
mehr
-q
still (mit -n keine Ausgabe)
-n
nur zeigen, was gespielt würde

bp [HZ [MS [ANZAHL]]] gibt einen Ton aus: Standard 880 Hz, 200 ms, einmal. Bei mehreren Tönen ist die Pause gleich der Tonlänge. -n zeigt nur, was gespielt würde (lautlos, für Tests), -q unterdrückt dabei die Ausgabe.

ersetzt: beep

Status: fertig (Mac)

bri brightness teilweise

Bildschirmhelligkeit zeigen und ändern

bri [-l -q -n] [[+|-]WERT[%]] [GERÄT]

statt brightnessctl backlight

mehr
-l
Geräte auflisten
-q
nur die Prozentzahl ausgeben
-n
nur zeigen, was geändert würde

bri zeigt die Bildschirmhelligkeit, bri 40 setzt sie auf 40 %, bri +10 / bri -10 ändern sie relativ. Mit Gerätename als zweites Argument (bri 50 kbd) auch Tastatur- oder zweite Beleuchtung; bri -l listet Geräte, -q gibt nur die Prozentzahl aus, -n zeigt nur, was passieren würde.

ersetzt: brightnessctl, backlight

Status: teilweise

bt bluetooth teilweise

Bluetooth anzeigen: Steuerbaustein, gekoppelte Geräte, Verbindung, Akku

bt [-v -q] [on|off]

statt bluetoothctl hciconfig blueutil

mehr
-v
auch Adressen und Firmware
-q
ohne Kopfzeile

Geräteadressen und Firmware nur mit -v. bt on|off würde den Mac umstellen – das macht bt dort nicht.

ersetzt: bluetoothctl, hciconfig, blueutil, bluetooth-config, hccontrol

Status: teilweise

cu serialterm fertig

Serielle Schnittstelle als Terminal (Gerät ↔ Tastatur/Bildschirm)

cu [-x -q] [-b BAUD] [-f 8N1] [-e ZEICHEN] [-l LOG] [-s TEXT] [-w SEK] GERÄT

statt minicom screen picocom microcom tip

mehr
-b
Baudrate (Standard 115200)
-f
Format Bits/Parität/Stopp, z. B. 8N1 (Standard), 7E1
-e
Fluchtzeichen statt ~ (nach Zeilenanfang; <E>. beendet)
-l
alles Empfangene zusätzlich in diese Datei schreiben
-s
TEXT senden (\r \n \t \\ erlaubt), dann wie ohne -s weiter
-w
ohne Terminal: so viele Sekunden nach Ende der Eingabe noch mitlesen (Standard 1)
-x
Empfangenes als Hexbytes zeigen
-q
keine Statuszeilen

cu [-b BAUD] [-f 8N1] [-e ZEICHEN] [-l LOG] [-s TEXT] [-w SEK] [-x] [-q] GERÄT verbindet Tastatur und Bildschirm mit einem seriellen Gerät (Standard 115200 8N1). Ersetzt minicom, screen, picocom, microcom, cu, tip.

ersetzt: minicom, screen, picocom, microcom, cu, tip

Status: fertig (Mac)

dmm devmem teilweise

Physischen Speicher und Geräteregister lesen und schreiben

dmm [-b -h -w -l] [-f ABBILD] [-v -n -q] ADRESSE [WERT[:MASKE]]

statt devmem

mehr
-b
1 Byte
-h
2 Byte (Halbwort)
-w
4 Byte (Wort, Standard)
-l
8 Byte
-f
erstes Argument ist eine Abbilddatei statt echtem Speicher (Adresse = Dateiversatz)
-d
Auszug: ANZAHL Einheiten zeigen (Standard 1)
-v
nach dem Schreiben zurücklesen und vergleichen
-n
nur zeigen, was geschrieben würde
-q
nur den Wert ausgeben

- dmm 0x10 liest, dmm 0x10 0xdeadbeef schreibt. Breite: -b 1, -h 2, -w 4 (Standard), -l 8 Byte (little endian). - WERT:MASKE ändert nur die Bits der Maske (Lesen-Ändern-Schreiben) – für Register mit Steuerbits. - -v liest nach dem Schreiben zurück und vergleicht, -n zeigt nur, was geschrieben würde, -q gibt nur den Wert aus. - -d zeigt ANZAHL Einheiten als Auszug (16 Byte je Zeile). - -f ABBILD: erstes Argument ist eine Datei statt echtem Speicher, Adresse = Dateiversatz. Auf dem Mac der einzige Weg (Tests). - Adressen müssen zur Breite ausgerichtet sein; Zugriff außerhalb des Abbilds ist ein Fehler.

ersetzt: devmem

Status: teilweise

dsp display teilweise

Grafik und Bildschirme anzeigen: Auflösung, Anschluss, Hauptbildschirm, Spiegelung

dsp [-q]

statt xrandr fbset displayplacer

mehr

Plattform: plat_host.c liest system_profiler SPDisplaysDataType (mit DSP_TESTFILE eine Datei), plat_nullos.c ist ein Platzhalter.

ersetzt: xrandr, fbset, displayplacer, dispdiag, vidcontrol

Status: teilweise

dv devices teilweise

Geräte auflisten (USB, PCI, Datenträger, Netzkarten)

dv [-l -q] [usb|pci|disk|net]

statt lsusb lspci udevadm ioreg devcon

mehr
-l
ausführlich (Größe, Klasse, Seriennummer)
-q
nur Kennung bzw. Name, eine je Zeile (für Skripte)

dv zeigt alle Geräte: dv alles, dv usb|pci|disk|net eine Art, -l ausführlich, -q nur Kennung/Name (Skripte). Spalten: Art, Kennung (Hersteller:Produkt hex bei usb/pci, BSD-Name bei Datenträgern), Name. Rückgabe: 0 gefunden, 1 nichts gefunden/Fehler, 2 falscher Aufruf.

ersetzt: udevadm, ioreg, devmgmt.msc, devcon, devctl, devinfo, udev, mdev, devfs, devd, udevadm monitor, inotifyd, getevent

Status: teilweise

ej eject teilweise

Wechseldatenträger sicher auswerfen

ej [-n -v -l] [GERÄT|ORDNER]...

statt eject

mehr
-l
auswerfbare Laufwerke auflisten (auch ohne Argumente)
-v
anzeigen, was ausgeworfen wird
-n
nur zeigen, was ausgeworfen würde

ej listet auswerfbare Laufwerke, ej ORDNER_ODER_GERÄT wirft aus, ej -n … zeigt nur, was passieren würde.

ersetzt: eject, drutil eject, diskutil eject, cdcontrol eject

Status: teilweise

fnt consolefont fertig

Linienschrift ansehen, prüfen und um Zeichen erweitern

fnt show|art|check|dump|c [-f SCHRIFT] [-s N] [-t N] [-o BILD.ppm] [TEXT...]

statt setfont loadfont

mehr
-f
Schriftdatei (Textformat) über die eingebaute Schrift legen
-s
Pixel je Rasterschritt (1..64, Standard 4)
-t
Strichdicke in Pixeln (Standard s/3)
-o
Bild in Datei schreiben statt nach stdout (PPM, P6)

fnt ist das Werkzeug für nullos' eigene Linienschrift (kernel/font.c: Linienzüge auf einem Raster x 0..4, y 0..9). Es ersetzt setfont, loadfont und vidcontrol -f; Schriften sind hier kleine Textdateien, keine Bitmaps.

ersetzt: setfont, loadfont, vidcontrol -f

Status: fertig (Mac)

gp gpio teilweise

GPIO-Pins zeigen, lesen, setzen, beobachten, PWM

gp [info [PIN...] | get PIN... | set PIN=0|1... [-t MS] | watch PIN... [-c N] [-t MS] | pwm PIN HZ PROZENT [-t MS]]

statt gpiodetect gpioget gpioset gpioinfo

mehr
-q
nur Werte, ohne Beschriftung
-n
Probelauf: nichts anfassen
-p
Pull-Widerstand beim Lesen/Beobachten: up oder down
-t
Dauer in Millisekunden
-c
Anzahl Ereignisse bei watch

-n ist Probelauf. Pins heißen 4, gpio4 oder io4. Rückgabe 0/1/2 wie überall. Nur Mac: gp sim 9=1|0|z legt von außen einen Pegel an (z = offen), damit man Eingänge testen kann.

ersetzt: gpiodetect, gpioget, gpioset, gpioinfo, gpiofind, gpio*, gpioctl

Status: teilweise

hw hardware teilweise

Hardware anzeigen: Übersicht, PCI- und USB-Geräte

hw [-v -n -q] [pci|usb|alle]

statt lspci lsusb lshw system_profiler msinfo32

mehr
-v
mehr Einzelheiten (Klassencode, Revision, Untersystem, USB-Ort)
-n
nur Kennzahlen, keine Herstellernamen
-q
ohne Kopfzeile

Ein Werkzeug statt lspci, lsusb, lshw, system_profiler, msinfo32. Hersteller- und Klassennamen kommen aus einer kleinen eingebauten Tabelle (die häufigsten, auch QEMU/virtio, ESP32, CH340, FTDI); sonst steht -. Seriennummern und Geräte-IDs des Rechners werden absichtlich nicht gezeigt.

ersetzt: lspci, system_profiler SPPCIDataType, pnputil /enum-devices, pciconf -lv, lsusb, system_profiler SPUSBDataType, ioreg, usbconfig, lshw, hwinfo, dmidecode, system_profiler, msinfo32, systeminfo, devinfo, pciconf, lsirq, irqtop, vmstat -i, system_profiler S

Status: teilweise

i2c i2c teilweise

I2C-Bus: Geräte suchen, Register lesen/schreiben, Speicher auslesen

i2c [-b BUS] [-n] scan | buses | dump ADR [VON [BIS]] | get ADR REG [ANZAHL] | set [-c] ADR REG WERT... | xfer w2@ADR B B r4

statt i2cdetect i2cdump i2cget i2cset i2ctransfer

mehr
-b
Busnummer (Standard 0)
-n
schreibende Befehle nur zeigen, nichts senden
-c
nach dem Schreiben zurücklesen und vergleichen (set)

Ersetzt i2cdetect, i2cdump, i2cget, i2cset, i2ctransfer durch ein Werkzeug mit Unterbefehlen:

ersetzt: i2cdetect, i2cdump, i2cget, i2cset, i2ctransfer, i2c*, i2c

Status: teilweise

kb keyboard fertig

Tastaturbelegung laden, zeigen, auflisten, einzelne Tasten ändern

kb list | get | show [BELEGUNG] | load [-n] BELEGUNG | check DATEI | set TASTE NORMAL [SHIFT [ALTGR [SHIFT+ALTGR]]] | key [BELEGUNG] TASTE...

statt loadkeys dumpkeys showkey setkeycodes

mehr
-n
load: nur prüfen, nichts laden

Ersetzt loadkeys, dumpkeys, showkey (teilweise), setkeycodes (als set), kbdcontrol, loadkmap/dumpkmap.

ersetzt: loadkeys, kbd_mode, setkeycodes, showkey, dumpkeys, mode con cp, kbdcontrol, kbdmap, loadkmap, dumpkmap

Status: fertig (Mac)

lpt lptport teilweise

Parallelport-Einstellungen anzeigen und setzen

lpt [-n] show [PORT] | set EINSTELLUNG WERT [PORT]

statt tunelp lptcontrol

mehr
-n
nur zeigen, nichts setzen

lpt show [PORT] zeigt die Einstellungen von lptPORT (Standard 0), lpt set EINSTELLUNG WERT [PORT] ändert eine. Einstellungen: chars (Zeichen je Versuch), time (Wartezeit), wait (Strobe-Wartezeit), abort (bei Fehler abbrechen 0/1), check (Status prüfen 0/1), reset (1 = Port zurücksetzen). -n zeigt nur, was gesetzt würde.

ersetzt: tunelp, lptcontrol, mode lpt, MODE, PRINT

Status: teilweise

rk radiokill teilweise

Funk (WLAN, Bluetooth) auflisten, sperren, freigeben

rk | rk [-n] -b [wlan|bt|alle] | rk [-n] -u [wlan|bt|alle]

statt rfkill

mehr
-b
sperren (Flugmodus)
-u
freigeben
-n
nur zeigen, was geschaltet würde

dort fehlt noch die Systemschnittstelle

ersetzt: rfkill, networksetup -setairportpower

Status: teilweise

sen sensors teilweise

Sensoren zeigen: Akku, Netzteil, Leistungsaufnahme, Wärmewarnungen, Temperaturen

sen [-q]

statt sensors powermetrics acpi

mehr
-q
Hinweis auf fehlende Temperaturfühler weglassen

macOS gibt Temperaturen und Lüfterdrehzahlen nur Administratoren heraus (powermetrics, private SMC-/HID- Schnittstellen); sen sagt das, statt etwas zu erfinden. Der Akkustand stimmt mit pmset -g batt überein.

ersetzt: sensors, powermetrics, sysctl dev.cpu.*.temperature

Status: teilweise

ser serial fertig

Serielle Schnittstelle anzeigen und einstellen (Baudrate, Parität, Flusssteuerung)

ser [-n -q] GERÄT [BAUD] [8n1] [rtscts|xonxoff|nofc] [raw]

statt setserial ldattach stty comcontrol

mehr
-n
nur zeigen, was gesetzt würde
-q
nach dem Setzen still bleiben

ser GERÄT zeigt Baudrate, Rahmen und Flusssteuerung; ser GERÄT 115200 8n1 rtscts setzt sie. Angaben in beliebiger Reihenfolge: Zahl = Baud, 8n1 = Datenbits/Parität (n e o)/Stoppbits, rtscts, xonxoff, nofc (keine Flusssteuerung), raw (rohe Übertragung ohne Zeilenverarbeitung). -n zeigt nur, -q schweigt nach dem Setzen.

ersetzt: setserial, ldattach, stty, mode COMx, comcontrol

Status: fertig (Mac)

spi spi teilweise

SPI-Bus: Rohübertragungen und W5500-Ethernet-Chip ansprechen

spi [-d GERÄT] [-s HZ] [-m 0-3] [-v] list|xfer HEX...|w5500 info|version|reset|read|write|set

statt spidev_test

mehr
-d
SPI-Gerät (Standard /dev/spi0, auf dem Mac sim; außerdem sim:DATEI, sim:-)
-s
Takt in Hz (Standard 1000000)
-m
SPI-Modus 0-3 (Standard 0)
-v
jeden Rahmen (gesendet/empfangen) anzeigen

SPI-Bus ansprechen (ersetzt spidev_test) und den W5500-Ethernet-Chip abfragen, der auf dem ESP32-C5 der geplante Netzweg ist (siehe docs/esp32c5.md).

ersetzt: spidev_test, spi

Status: teilweise

tpm tpm teilweise

TPM 2.0 abfragen: Zufall, PCR-Register, Eigenschaften

tpm [-d GERÄT] [-x] startup|rand [N]|pcr [BANK] [NR...]|caps|banks

statt tpm2 tpmtool

mehr
-d
Gerät: Datei (/dev/tpm0), Unix-Socket oder HOST:PORT bzw. IPv6]:PORT (swtpm); Standard $TPM, sonst /dev/tpm0
-x
Befehl nur als Hex zeigen, nicht senden

Ersetzt tpm2-tools / tpmtool für die häufigsten Abfragen. Spricht TPM 2.0 selbst (Befehle von Hand gebaut, ohne Bibliothek).

ersetzt: tpm2-tools, tpmtool, tpmvscmgr

Status: teilweise

tyc typec teilweise

USB-C-Anschluss: Quelle, Leistung, Power-Delivery-Profile zeigen

tyc [-q] [-p]

statt ucsicontrol

mehr
-q
nur Leistung in Watt (0 und Fehlercode 1 ohne Quelle)
-p
auch alle angebotenen Profile (* = aktiv)

tyc zeigt die angeschlossene USB-C-Quelle: Art, Leistung (W), ausgehandelte Spannung/Strom, Name, Hersteller. tyc -p listet zusätzlich alle angebotenen Power-Delivery-Profile (* = aktiv), tyc -q gibt nur die Watt aus (0 und Rückgabe 1 ohne Quelle).

ersetzt: typec, ucsicontrol

Status: teilweise

vt vtswitch teilweise

Virtuelle Konsolen anzeigen, wechseln, Programme darauf starten, freigeben

vt [-s -f -v -n] [KONSOLE [BEFEHL...]]

statt chvt openvt deallocvt

mehr
-s
mit BEFEHL: danach zu dieser Konsole wechseln
-f
Konsole freigeben (nicht Nr. 1, nicht die aktive)
-v
jeden Schritt anzeigen
-n
nur zeigen, was passieren würde

Ersetzt chvt, openvt, deallocvt in einem Werkzeug.

ersetzt: chvt, deallocvt, openvt, vidcontrol -s

Status: teilweise

11. Benutzer und Anmeldung

aud audit fertig

Prüfprotokoll mit Hash-Kette: Ereignisse eintragen, suchen, Unversehrtheit prüfen

aud log EREIGNIS... | list [-n ZAHL] | search TEXT | verify

statt auditctl ausearch praudit auditpol

mehr

aud log EREIGNIS... hängt eine Zeile an $NULLOS_VAR/log/audit an: NR<TAB>SEKUNDEN<TAB>BENUTZER<TAB>EREIGNIS<TAB>KETTE, wobei KETTE der SHA-256 über „vorherige Kette + Zeile“ ist. aud verify erkennt geänderte, eingefügte und herausgenommene Zeilen (nicht aber das Abschneiden am Ende – das geht nur mit einer außerhalb gespeicherten letzten Kette). list [-n ZAHL], search TEXT. Die Datei sollte der Kernel nur anhängen lassen (Wunsch). Ersetzt auditctl/ausearch/praudit/auditpol nur als Protokoll, nicht als Regelwerk für Systemaufrufe.

ersetzt: auditctl, ausearch, praudit, audit, auditpol, secedit, auditreduce

Status: fertig (Mac)

grp group fertig

Gruppen anlegen, löschen, Mitglieder ändern, auflisten

grp list | show NAME | add NAME [-g NR] | del NAME | join NAME BENUTZER | leave NAME BENUTZER

statt groupadd groupdel groupmod gpasswd addgroup delgroup dseditgroup

mehr

Nummern ab 1000 automatisch; eine Gruppe, die Hauptgruppe eines Benutzers ist, lässt sich nicht löschen. Ersetzt groupadd, groupdel, groupmod, gpasswd, addgroup, dseditgroup, net localgroup. Datei $NULLOS_ETC/group. Umbenennen und Gruppenpasswörter fehlen.

ersetzt: groupadd, addgroup, dseditgroup, net localgroup /add, pw groupadd, groupdel, delgroup, dseditgroup -o delete, net localgroup /delete, pw groupdel, groupmod, gpasswd, usermod -aG, net localgroup, pw groupmod

Status: fertig (Mac)

gty getty fertig

Begrüßung zeigen und die Anmeldung starten, nach der Abmeldung von vorn

gty [-1] [-l ANMELDEPROGRAMM]

statt agetty mingetty

mehr
-1
nur einmal (Test), sonst endlos
-l
anderes Anmeldeprogramm als lgn

gty zeigt die Begrüßung aus $NULLOS_ETC/issue (\n Rechnername aus der Datei hostname, \l Terminal, \d Datum, \t Uhrzeit, \\), startet dann lgn und beginnt nach der Abmeldung von vorn – endlos; -1 nur einmal (Tests), -l PROGRAMM anderes Anmeldeprogramm. Fehlt das Programm, wartet gty 5 Sekunden statt zu rasen. Ersetzt getty, agetty, mingetty. Auf nullos ist der Terminalname bis docs/syscalls.md fest „console“ (plat_nullos.c).

ersetzt: agetty, getty, mingetty

Status: fertig (Mac)

id identity fertig

Benutzer und Gruppen anzeigen

id [-u -g -G -n] [BENUTZER]

statt whoami groups logname

mehr
-u
nur die Benutzernummer
-g
nur die Hauptgruppe
-G
alle Gruppen
-n
Namen statt Nummern (mit -u -g -G)

id zeigt Benutzer- und Gruppennummern samt Namen: uid=1000(anna) gid=1000(anna) groups=1000(anna),50(staff). id -u, -g, -G zeigen nur eine Angabe, -n Namen statt Nummern, id BENUTZER fragt einen anderen Benutzer ab. Ersetzt id, whoami, groups, logname, whoami /groups.

ersetzt: id, whoami /all, whoami, logname, echo %USERNAME%, groups, whoami /groups

Status: fertig (Mac)

kr keyring fertig

Geheimnisse (Passwörter, Schlüssel) verschlüsselt mit Hauptpasswort ablegen

kr set NAME < wert | get NAME | rm NAME | list

statt secret-tool pass cmdkey

mehr

kr set NAME (Wert von stdin), kr get NAME, kr rm NAME, kr list. Jeder Eintrag ist eine eigene Datei in $NULLOS_ETC/keyring/ (Modus 600), verschlüsselt wie bei ssl enc (AES-256-CTR + HMAC-SHA-256, Schlüssel aus PBKDF2-SHA-256 mit 100000 Runden und Zufallssalz; Format siehe cmd/ssl/README.md). Das Hauptpasswort kommt aus der Umgebungsvariable KR_MASTER (kein Abfragedialog – dafür ist später eine Oberfläche zuständig). Der Name ist offen sichtbar, der Wert nicht; falsches Passwort oder Veränderung ergibt eine Fehlermeldung ohne Ausgabe. Die Standard-Bausteine sind nicht gegen Zeit-Seitenkanäle gehärtet (siehe ssl). Ersetzt secret-tool, security, cmdkey, pass (ohne gpg, ohne Synchronisation).

ersetzt: secret-tool, security, cmdkey, gnome-keyring, pass

Status: fertig (Mac)

krb kerberos teilweise

Kerberos-Anmeldedaten: Zwischenspeicher lesen, schreiben, löschen

krb list|add|export|destroy|init [-c DATEI] ...

statt klist kinit kdestroy

mehr
-c
Zwischenspeicher-Datei (sonst $KRB5CCNAME, sonst /tmp/krb5cc_UID)
-v
list: mehr Angaben (Schlüsselart, Flags)

- krb list [-c DATEI] [-v] (klist): zeigt Principal, Dienste, Beginn/Ablauf (UTC), „abgelaufen“; -v Flags, Schlüsselart, Ticketgröße. - krb add [-c DATEI] CLIENT DIENST BEGINN ENDE: Eintrag im eigenen Textformat krb1 anlegen (Zeiten in Sekunden seit 1970). - krb export [-c DATEI] ZIEL: als MIT-ccache v4 (0x0504, Big Endian) schreiben. - krb destroy [-c DATEI] (kdestroy): überschreibt mit Nullen und löscht. - krb init (kinit): meldet „noch nicht gebaut“ (Exit 1).

ersetzt: kinit, klist, kdestroy, ksetup, ktpass

Status: teilweise

la lastlogins fertig

letzte Anmeldungen zeigen

la [-b] [-n ZAHL] [BENUTZER]

statt last lastb lastlog lastlogin

mehr
-b
misslungene Anmeldungen
-n
höchstens so viele Zeilen (Standard 20)

la listet die letzten Anmeldungen aus $NULLOS_VAR/log/wtmp (neueste zuerst) mit Abmeldezeit und Dauer oder „noch angemeldet“; -b die misslungenen aus btmp, -n ZAHL begrenzen, la BENUTZER filtern. Fehlende Datei = leere Liste. Ersetzt last, lastb, lastlog, lastlogin. Format der Dateien: docs/fabrik/fabrik-rest.md; geschrieben werden sie von lgn.

ersetzt: last, lastb, lastlog, lastlogin, utmpdump, utx

Status: fertig (Mac)

lgn login fertig

anmelden: Benutzer und Passwort prüfen, Shell starten, Anmeldung eintragen

lgn [-p] [-h HOST] [BENUTZER]

statt login sulogin

mehr
-p
keine Eingabeaufforderungen (Skripte, Tests)
-h
Herkunft (Host) für die Anmeldeliste

lgn [BENUTZER] fragt Benutzer und Passwort (drei Versuche), prüft gegen passwd/shadow, wechselt in den Heimordner, trägt die Anmeldung in $NULLOS_VAR/run/utmp und log/wtmp ein (misslungene in log/btmp), startet die Shell des Benutzers und trägt nach dem Ende die Abmeldung ein. Existiert $NULLOS_ETC/nologin, kommen nur Verwalter herein und der Inhalt wird gezeigt. -p ohne Eingabeaufforderungen (Skripte), -h HOST Herkunft. who und la lesen die Listen. Ersetzt login, sulogin, nologin (Datei statt Programm).

ersetzt: login, sulogin, nologin

Status: fertig (Mac)

msg message fertig

Nachricht an alle oder einen angemeldeten Benutzer; Empfang ein-/ausschalten

msg all TEXT... | msg to BENUTZER TEXT... | msg on | off | state

statt wall write mesg

mehr

msg all TEXT schreibt auf alle in $NULLOS_VAR/run/utmp eingetragenen Terminals (/dev/LINIE), msg to BENUTZER TEXT an einen Benutzer, msg off|on|state schaltet den eigenen Empfang (Liste $NULLOS_VAR/run/nomsg). Wer abgeschaltet hat, bekommt nichts (gezielte Nachricht: Fehlermeldung); der Absender (Name aus $USER) wird mitgeschickt. Geräteordner $NULLOS_DEV nur auf dem Mac (nullos: fest /dev). Ersetzt wall, write, mesg, msg *. Kein Gespräch (talk).

ersetzt: wall, msg *, rwall, write, talk, msg, mesg

Status: fertig (Mac)

ng newgroup fertig

Shell oder Befehl mit anderer Hauptgruppe starten (nur eigene Gruppen)

ng GRUPPE [BEFEHL [ARG...]]

statt newgrp sg

mehr

ng GRUPPE [BEFEHL ...] startet die Shell des Benutzers oder den Befehl mit GRUPPE als Hauptgruppe, wenn der Benutzer dort Mitglied ist (oder GRUPPE seine Hauptgruppe ist). Setzt NULLOS_GROUP und NULLOS_GID. Auf dem Mac wechselt der Prozess die Gruppe nur als Verwalter; sonst wird nur geprüft und die Variable gesetzt. plat_nullos.c ist Platzhalter bis docs/syscalls.md setgid liefert. Gruppenpasswörter gibt es nicht. Ersetzt newgrp, sg.

ersetzt: newgrp, sg

Status: fertig (Mac)

nss nameservice fertig

Einträge der Namensdatenbanken (Benutzer, Gruppen, Rechner, Dienste) abfragen

nss DATENBANK [SCHLÜSSEL...]

statt getent dscacheutil

mehr

nss DATENBANK [SCHLÜSSEL...] gibt Einträge aus passwd, group, shadow, hosts, services, protocols, shells (Ordner $NULLOS_ETC, sonst /etc). Ohne Schlüssel alles; bei passwd/group Name oder Nummer; bei hosts/services jedes Wort (Name, Alias, Adresse, Port). Rückgabe 2, wenn ein Schlüssel nicht gefunden wurde (wie getent). Es werden nur die Dateien gelesen – DNS und Verzeichnisdienste gibt es hier nicht. Ersetzt getent, dscacheutil -q.

ersetzt: getent, dscacheutil

Status: fertig (Mac)

psw password fertig

Passwort setzen, prüfen, entfernen

psw [-s | -d | -c | -S] BENUTZER | psw -b

statt passwd chpasswd

mehr
-s
neues Passwort als eine Zeile von stdin (für Skripte)
-d
Passwort entfernen
-c
Passwort von stdin prüfen (Rückgabe 0 = richtig)
-S
Zustand zeigen (P gesetzt, L gesperrt, NP keines)
-b
viele auf einmal: Zeilen NAME:PASSWORT von stdin

psw BENUTZER fragt zweimal (ohne Anzeige, wenn stdin ein Terminal ist) und speichert den Hash in shadow. psw -s BENUTZER liest eine Zeile von stdin (Skripte), psw -b viele Zeilen NAME:PASSWORT (wie chpasswd), psw -c BENUTZER prüft ein Passwort von stdin (Rückgabe 0 = richtig), -S zeigt den Zustand (P / L gesperrt / NP keins), -d entfernt das Passwort. Mindestlänge 4. Ändern darf der Verwalter (0) und der Benutzer selbst.

ersetzt: passwd, net user NAME *, chpasswd, chage, pwpolicy, net accounts, pw usermod -e

Status: fertig (Mac)

qt quota fertig

Grenzen für belegten Speicher je Benutzer festlegen und die Belegung eines Ordners melden

qt set BENUTZER GRÖSSE | rm BENUTZER | list | report ORDNER | check BENUTZER ORDNER

statt quota repquota edquota fsutil-quota

mehr

qt set BENUTZER GRÖSSE (z. B. 500, 64K, 10M, 2G), rm, list; qt report ORDNER zählt die Dateigrößen je Besitzer (Nummer → Name über passwd) und zeigt Belegung, Grenze und Prozent, Rückgabe 1 wenn jemand darüber liegt; qt check BENUTZER ORDNER meldet einen einzelnen Benutzer. Tabelle $NULLOS_ETC/quota (BENUTZER:BYTES). Meldet nur: das Verhindern des Schreibens muss das Dateisystem leisten (Wunsch); gezählt wird die Dateigröße, nicht die belegten Blöcke. Ersetzt quota, repquota, edquota, fsutil quota sinngemäß.

ersetzt: quota, edquota, repquota, quotacheck, fsutil quota

Status: fertig (Mac)

su superuser fertig

als anderer Benutzer (Standard: Verwalter) eine Shell oder einen Befehl starten

su [-c BEFEHL] [-s SHELL] [-p] [BENUTZER]

statt runuser runas sudo doas

mehr
-c
Befehl statt Shell ausführen
-s
andere Shell
-p
Passwort ohne Eingabeaufforderung von stdin lesen (Skripte)

su [-c BEFEHL] [-s SHELL] [BENUTZER] startet Shell oder Befehl als BENUTZER (Standard root), nach Passwortabfrage (ohne Anzeige am Terminal). Der Verwalter (Nummer 0) braucht kein Passwort; gesperrte Konten (! in shadow) lassen sich nicht öffnen; ein leeres Passwortfeld heißt „ohne Passwort“. Setzt USER, LOGNAME, HOME, SHELL; Rückgabewert = der des Befehls. -p liest das Passwort von stdin ohne Eingabeaufforderung (Skripte, Tests). Ersetzt su, runuser, runas, sudo/doas (ohne Regeldatei – nur über Passwort des Zielbenutzers).

ersetzt: su, runas, sudo, doas, pkexec, runuser, setpriv, su -m

Status: fertig (Mac)

usr user fertig

Benutzer anlegen, ändern, sperren, löschen, auflisten

usr list | show NAME | add NAME [-u NR -g GRUPPE -d HOME -s SHELL -c TEXT -M] | mod NAME [...] | del NAME [-r] | lock NAME | unlock NAME

statt useradd userdel usermod lslogins adduser deluser net-user

mehr
-u
Benutzernummer
-g
Hauptgruppe (Name oder Nummer)
-d
Heimordner
-s
Shell
-c
Kommentar (Voller Name)
-M
Heimordner nicht anlegen
-r
beim Löschen den Heimordner mit entfernen

Neue Benutzer bekommen eine eigene Gruppe, Nummern ab 1000, ein gesperrtes Passwort (psw NAME setzt eines). Ersetzt useradd, userdel, usermod, lslogins, getent passwd, net user, sysadminctl. Dateien: $NULLOS_ETC/passwd, shadow, group (Format: docs/fabrik/fabrik-rest.md); jede Änderung schreibt atomar über eine Hilfsdatei. Umbenennen von Benutzern fehlt noch (Wunsch).

ersetzt: lslogins, getent passwd, dscl . list /Users, net user, logins, getent, useradd, adduser, sysadminctl -addUser, dscl, net user /add, pw useradd, userdel, deluser, sysadminctl -deleteUser, net user /delete, rmuser, pw userdel, usermod, wmic useraccount, pw

Status: fertig (Mac)

vl lockscreen fertig

Terminal sperren, bis das Passwort des Benutzers eingegeben wird

vl [-q] [-u BENUTZER]

statt vlock lock

mehr
-q
keine Meldungen
-u
für diesen Benutzer entsperren (Standard: eigener)

vl sperrt das Terminal: liest Eingaben, bis das Passwort des Benutzers (-u, sonst der eigene) stimmt; Strg-C wird ignoriert; nach drei Fehlversuchen gibt es 2 Sekunden Pause je weiterem. Endet die Eingabe (Terminal weg), bleibt der Rückgabewert 1. Konten ohne Passwort oder gesperrte werden abgelehnt, damit niemand sich selbst aussperrt. Der Bildschirm wird nicht gelöscht (lib/term.h kommt später – Wunsch). Ersetzt vlock, lock, LockWorkStation.

ersetzt: vlock, loginctl lock-session, rundll32 user32.dll, LockWorkStation, lock

Status: fertig (Mac)

who loggedin fertig

zeigen, wer angemeldet ist

who [-q -H]

statt users w

mehr
-q
nur Namen und Anzahl
-H
Überschriftzeile

who listet die angemeldeten Benutzer aus $NULLOS_VAR/run/utmp (sonst /var/run/utmp); Zeilen BENUTZER<TAB>LINIE<TAB>SEKUNDEN<TAB>HOST (siehe docs/fabrik/fabrik-rest.md). -q nur Namen + Anzahl, -H Überschrift. Ersetzt who, users, w (ohne Prozessspalten), query user. Fehlt die Liste, ist niemand angemeldet. login (lgn) schreibt die Liste.

ersetzt: who, users, query user, quser, w, query session, finger, pinky

Status: fertig (Mac)

12. Netzwerk

bw bandwidth fertig

Durchsatz (TCP/UDP) und Latenz zwischen zwei Rechnern messen

bw -s [-u -1] [-p PORT] [ADRESSE]   |   bw [-u -R -P] [-p PORT -t SEK -l BYTE -b MBIT -c ANZAHL] HOST

statt iperf3

mehr
-s
Server (Gegenstelle) starten
-u
UDP statt TCP
-1
Server: nach einer Messung beenden
-R
umgekehrt messen (Server sendet, Client empfängt; nur TCP)
-P
Latenz messen (Echo hin und zurück) statt Durchsatz
-p
Port (Vorgabe 5201)
-t
Messdauer in Sekunden (Vorgabe 5)
-l
Blockgröße in Byte (TCP 4096, UDP 1200)
-b
UDP-Sendegeschwindigkeit in Mbit/s (Vorgabe 10)
-c
Anzahl Echos bei -P (Vorgabe 10)

bw (lang bandwidth, ersetzt iperf3, networkQuality) misst zwischen zwei Rechnern. Auf der Gegenstelle bw -s, dann bw HOST.

ersetzt: iperf3, networkQuality, iperf

Status: fertig (Mac)

dh dhcp teilweise

Adresse, Router und DNS per DHCP (IPv4) oder DHCPv6 holen und setzen

dh [-4 -6 -n] [-m MAC] [-s SERVER[:PORT]|[SERVER6]:PORT] [-p PORT] [-W SEK] SCHNITTSTELLE

statt dhclient dhcpcd udhcpc

mehr
-4
DHCPv4 (Standard)
-6
DHCPv6 (mit -4 zusammen: beides)
-n
nur holen und zeigen, nichts setzen
-m
diese MAC-Adresse verwenden
-s
diesen Server fragen statt Rundsendung (zum Testen)
-p
eigener Port statt 68 bzw. 546 (zum Testen)
-W
Wartezeit für die erste Antwort in Sekunden (Standard 2, verdoppelt sich bis zu 4 Versuche)

und /etc/resolv.conf umgesetzt, aber nicht getestet (braucht Rechte und würde auf dem Mac die Netzeinstellungen stören); kein Verlängern, kein Freigeben, kein Hintergrunddienst.

ersetzt: dhclient, dhcpcd, udhcpc, ipconfig set en0 DHCP, ipconfig /renew, dhcp

Status: teilweise

dhs dhcpserver fertig

DHCP-Server: Adressen, Router und DNS im Netz vergeben, Leases in einer Datei

dhs [-i SERVER-ADRESSE -r VON-BIS] [-6 VON-BIS] [-m MASKE] [-g ROUTER] [-d DNS,..] [-D DOMÄNE] [-t SEK] [-l DATEI] [-H MAC=IP] [-p PORT] [-c PORT] [-b ADRESSE] [-e DNS6,..] [-I SCHNITTSTELLE] [-Q PORT] [-C PORT] [-B ADRESSE6] [-N ANZAHL] [-v]

statt dhcpd dnsmasq udhcpd

mehr
-i
eigene Adresse (Server-Kennung)
-r
Adressbereich, z. B. 192.168.1.100-192.168.1.200
-m
Netzmaske (Standard 255.255.255.0)
-g
Router, der mitgeteilt wird
-d
DNS-Server, durch Komma getrennt
-D
Domäne
-t
Lease-Dauer in Sekunden (Standard 3600)
-l
Lease-Datei (Standard /var/lib/dhs.leases)
-H
feste Zuordnung MAC=Adresse (mehrfach möglich)
-p
eigener Serverport statt 67 (zum Testen)
-c
Clientport statt 68 für Rundsendungen
-b
nur an dieser Adresse lauschen (zum Testen)
-6
IPv6-Adressbereich für DHCPv6, z. B. fd00::100-fd00::1ff (nur die letzten 16 Bit dürfen sich unterscheiden)
-e
IPv6-DNS-Server, durch Komma getrennt (höchstens 2)
-I
Schnittstelle für DHCPv6 (tritt ff02::1:2 bei, nötig im echten Netz)
-Q
eigener DHCPv6-Serverport statt 547 (zum Testen)
-C
DHCPv6-Clientport statt 546
-B
DHCPv6 nur an dieser Adresse lauschen (zum Testen)
-N
nach ANZAHL Antworten beenden
-v
jede Anfrage und Antwort melden

im echten Netz (Port 67/547, Rundsendung, Multicast ff02::1:2) nicht gelaufen, weil dort kein fremder DHCP-Server gestört werden soll.

ersetzt: dhcpd, dnsmasq, kea, bootpd, udhcpd

Status: fertig (Mac)

dl download teilweise

Dateien über HTTP herunterladen und Anfragen schicken

dl [-q -v -I -f -c -n -N] [-o DATEI|-] [-d DATEN|@DATEI] [-X METHODE] [-H 'Name: Wert'] [-u NAME:PASSWORT] [-W SEK] URL...

statt curl wget fetch

mehr
-o
in diese Datei speichern (- = Standardausgabe)
-f
vorhandene Datei überschreiben
-c
abgebrochenen Abruf fortsetzen
-q
still (keine Fortschrittsanzeige)
-v
Anfrage und Antwortkopf zeigen
-I
nur den Antwortkopf holen (HEAD)
-d
Daten senden (POST), @DATEI liest sie aus einer Datei
-X
andere Methode (PUT, DELETE, …)
-H
zusätzliche Kopfzeile
-u
Anmeldung (Basic)
-N
Umleitungen nicht folgen
-n
nur zeigen, was geholt würde
-W
Zeitgrenze in Sekunden (Standard 30)

Eigene HTTP/1.1-Umsetzung: Content-Length, Stückelung (chunked), Ende per Verbindungsschluss, Umleitungen (bis 10, auch relativ), Fortsetzen mit Range, Basic-Anmeldung, http_proxy, IPv6-Adressen in [ ].

ersetzt: curl, wget, bitsadmin, certutil -urlcache, fetch, ftp, lftp, ftpget, ftpput, tftp

Status: teilweise

dns dnslookup fertig

Namen und Adressen im DNS nachschlagen

dns [-v -T -r -4 -6] [-t TYP] [-p PORT] [-W SEK] NAME|ADRESSE [TYP] [@SERVER]

statt host nslookup dig drill

mehr
-t
Eintragstyp: A AAAA MX TXT NS CNAME SOA PTR SRV CAA ANY oder TYPnn
-v
ausführlich: TTL, Kopf, alle Abschnitte (wie dig)
-T
über TCP fragen
-r
ohne Rekursion fragen
-p
Port des Servers (Standard 53)
-W
Wartezeit je Versuch in Sekunden (Standard 2)
-4
nur IPv4-Server
-6
nur IPv6-Server

Eigener DNS-Client (UDP, bei gekürzter Antwort automatisch TCP). Fragt den ersten erreichbaren Server aus /etc/resolv.conf oder den mit @SERVER angegebenen – IPv4 und IPv6 gleich (@::1, IPv6-Server aus resolv.conf, -4/-6 wählen die Familie). AAAA-Einträge und Rückwärtssuche über ip6.arpa gehören dazu. Getestet auf 127.0.0.1 und ::1 (UDP und TCP).

ersetzt: host, nslookup, drill, dig

Status: fertig (Mac)

eth ethtool teilweise

Verbindung der Netzkarten: Art, Medium, Duplex, MTU, Fehlerzähler

eth [-a] [SCHNITTSTELLE] | eth [-n] SCHNITTSTELLE mtu ZAHL

statt ethtool

mehr
-a
auch die möglichen Medien zeigen
-n
nur zeigen, was eingestellt würde

und mit der Fehlermeldung ohne Rechte getestet; Medium/Geschwindigkeit setzen, Treiber- und Offload-Angaben fehlen

ersetzt: ethtool, netsh, ifconfig -m

Status: teilweise – Anzeigen fertig (Mac, abgeglichen mit ifconfig); MTU setzen umgesetzt, aber nur als Probelauf

fw firewall teilweise

Firewall-Regeln einfach schreiben, prüfen und in Tabellenform übersetzen

fw [-q -v] check|list|compile|dump|match|rule|laden|status ...

statt nft iptables ufw pfctl firewall-cmd

mehr
-q
still (nur Rückgabewert)
-v
Regeln nummeriert ausgeben

Regeln in den Netzstapel laden fehlt, bis nullos einen hat (plat_nullos.c ist Platzhalter).

ersetzt: nft, iptables, ufw, firewalld, pfctl, socketfilterfw, netsh advfirewall, ipfw, ipf

Status: teilweise

htp httpd fertig

Dateien eines Ordners über HTTP ausliefern (IPv4 und IPv6)

htp [-q] [-b ADRESSE] [-p PORT] [-W SEK] [ORDNER]

statt httpd

mehr
-b
nur auf dieser Adresse lauschen (IPv4, IPv6, ::1]); ohne: IPv6 und IPv4 zugleich
-p
Port (Standard 8000, 0 = frei wählen)
-q
Anfragen nicht protokollieren
-W
Zeitgrenze für den Anfragekopf in Sekunden (Standard 10)

GET und HEAD, index.html oder Ordnerliste, Dateityp nach Endung, ein Bereich per Range (zum Fortsetzen, z. B. dl -c), %xx in Pfaden, kein Weg aus dem Ordner hinaus (.., auch verschlüsselt). Eine Anfrage je Verbindung, eine Verbindung nach der anderen (kein fork, läuft so auch ohne MMU). Protokoll auf stderr: [::1]:50312 GET /a.txt HTTP/1.1 200.

ersetzt: python -m http.server, busybox httpd, python3 -m http.server, httpd

Status: fertig (Mac)

ip interface teilweise

Netzschnittstellen anzeigen, ein- und ausschalten, Adressen setzen

ip [-s -4 -6 -n] [NAME] [up|down|add ADRESSE/LÄNGE|del ADRESSE/LÄNGE]

statt ifconfig ipconfig networksetup

mehr
-s
Zähler (Bytes, Pakete, Fehler) aller Schnittstellen
-4
nur IPv4-Adressen
-6
nur IPv6-Adressen
-n
nur zeigen, was eingestellt würde

mit der Fehlermeldung ohne Rechte getestet; Brücken, VLANs, Tunnel, Umbenennen fehlen.

ersetzt: ip addr/link, ifconfig, networksetup, ipconfig, netsh interface, ip, ip link set, ifup, ifdown, nmcli, ifconfig up/down, netsh interface set interface, ifup/ifdown, bridge, brctl, ifconfig bridge, netsh bridge, ip link add type vlan, vconfig, ifconfig vla

Status: teilweise

ipc ipcalc fertig

IP-Netze berechnen (IPv4 und IPv6): Netz, Maske, Bereich, Art, Teilnetze

ipc ADRESSE[/LÄNGE] [MASKE] | ipc -s LÄNGE NETZ | ipc -c NETZ ADRESSE…

statt ipcalc sipcalc

mehr
-s
Netz in Teilnetze der angegebenen Länge teilen
-c
prüfen, ob Adressen im Netz liegen (Rückgabe 1, wenn nicht)

IPv4 und IPv6 gleichwertig; Adressen mit Bereich (fe80::1%en0) werden verstanden. /31 und /32 zählen alle Adressen als Rechner (RFC 3021). Reines C über net.c (siehe docs/fabrik/fabrik-netz.md).

ersetzt: ipcalc

Status: fertig (Mac)

isv inetd fertig

für jede TCP-Verbindung ein Programm starten (IPv4 und IPv6)

isv [-v] [-b ADRESSE] [-c ANZAHL] [-n VERBINDUNGEN] PORT BEFEHL [ARGUMENT…]

statt inetd xinetd tcpsvd

mehr
-b
nur auf dieser Adresse lauschen (IPv4, IPv6, ::1]); ohne: IPv6 und IPv4 zugleich
-c
höchstens so viele Programme gleichzeitig (Standard 20)
-n
nach so vielen Verbindungen aufhören
-v
jede Verbindung melden

Lauscht auf PORT (ohne -b auf IPv6 und IPv4 zugleich) und startet für jede Verbindung BEFEHL mit der Verbindung als Standardein- und -ausgabe. Wie bei tcpsvd/ucspi-tcp stehen PROTO=TCP, TCPREMOTEIP, TCPREMOTEPORT, TCPLOCALIP, TCPLOCALPORT in der Umgebung (IPv6 ohne Klammern, z. B. ::1).

ersetzt: inetd, xinetd, launchd, socat, tcpsvd, udpsvd

Status: fertig (Mac)

kg keygen teilweise

SSH-Schlüssel (Ed25519) erzeugen, anzeigen, vergleichen

kg gen [-f] [-c KOMMENTAR] DATEI | pub DATEI | fp DATEI... | copy PUB AUTHORIZED_KEYS

statt ssh-keygen ssh-copy-id

mehr
-f
vorhandene Schlüsseldatei überschreiben (gen)
-c
Kommentar im Schlüssel (gen)

Ersetzt ssh-keygen, ssh-agent, ssh-add, ssh-copy-id (soweit unten genannt).

ersetzt: ssh-keygen, ssh-agent, ssh-add, ssh-copy-id

Status: teilweise – Ed25519 ohne Passphrase; Agent, ssh-add und Fernkopie ausgelassen

ma mail in Arbeit

Mail senden (SMTP, IPv4 und IPv6) und das eigene Postfach lesen

ma [-f POSTFACH] [NUMMER] | ma -s BETREFF [-r ABSENDER] [-H SERVER[:PORT]] [-W SEK] [-n] EMPFÄNGER…

statt mail mailx sendmail

mehr
-s
Betreff; Text kommt von der Standardeingabe
-r
Absender (Standard $USER@localhost)
-H
SMTP-Server (Standard localhost:25), auch ::1]:2525
-f
Postfach (mbox, Standard $MAIL oder /var/mail/$USER)
-n
nur zeigen, was gesendet würde
-W
Zeitgrenze in Sekunden (Standard 30)

mit eigenem SMTP-Empfänger über 127.0.0.1 und ::1); STARTTLS/SMTPS und AUTH fehlen (brauchen TLS)

ersetzt: mail, mailx, sendmail

Status: in Arbeit

mdn mdns fertig

Dienste und Rechnernamen im lokalen Netz per mDNS finden (IPv4 und IPv6)

mdn [-r -v -4 -6] [-t SEK] [-i SCHNITTSTELLE] [-s SERVER] [DIENST|NAME.local]

statt avahi-browse avahi-resolve dns-sd

mehr
-r
Name.local in Adressen auflösen
-v
auch TXT-Angaben der Dienste zeigen
-t
so lange auf Antworten warten (Standard 2 s)
-i
nur über diese Schnittstelle (IPv6)
-s
einen Rechner direkt per Unicast fragen (auch ::1]:5353)
-4
nur IPv4 (224.0.0.251)
-6
nur IPv6 (ff02::fb)

eigenen Heimnetz (IPv4 und IPv6). Eigene Dienste anbieten (avahi-publish) fehlt.

ersetzt: avahi-browse, zcip, dns-sd

Status: fertig (Mac)

nb neighbors teilweise

Nachbarn im lokalen Netz zeigen (IP-Adresse, MAC, Schnittstelle)

nb [-q -v -4 -6] [ADRESSE]

statt arp ndp

mehr
-q
still, nur Rückgabewert (0 = bekannt)
-v
ausführlich: Zustand, auch unvollständige Einträge
-4
nur IPv4 (ARP)
-6
nur IPv6 (NDP)

Zeigt die Nachbartabelle (IPv4 ARP und IPv6 NDP) in einer Zeile je Nachbar: ADRESSE<Tab>MAC<Tab>SCHNITTSTELLE. Ersetzt ip neigh, arp und ndp (nur lesen).

ersetzt: ip neigh, arp, ndp, arping

Status: teilweise

nbd nbd teilweise

Datei als Blockgerät übers Netz anbieten, lesen und beschreiben (NBD, IPv4 und IPv6)

nbd serve [-r -v] [-b ADRESSE] [-p PORT] [-n NAME] DATEI | nbd info|get|put RECHNER[:PORT] …

statt nbd-server nbd-client

mehr
-r
nur lesen anbieten
-b
nur auf dieser Adresse lauschen (IPv4, IPv6, ::1]); ohne: IPv6 und IPv4 zugleich
-p
Port (Standard 10809, 0 = frei wählen)
-n
Exportname (Standard leer)
-o
get: in diese Datei statt Standardausgabe
-v
Verbindungen melden

als echtes Blockgerät einhängen fehlt (braucht den nullos-Kernel), gegen fremde NBD-Programme nicht getestet

ersetzt: nbd-client, nbd-server, ggate

Status: teilweise

nc netcat fertig

rohe TCP- und UDP-Verbindungen: senden, empfangen, Ports prüfen

nc [-l -k -u -z -v -4 -6] [-w SEK] [RECHNER] PORT...

statt ncat netcat telnet socat

mehr
-l
auf eine Verbindung warten (Server)
-k
mit -l: danach weitere Verbindungen annehmen
-u
UDP statt TCP
-z
nur prüfen, welche Ports offen sind (auch Bereiche 20-30)
-w
Zeitgrenze in Sekunden (Verbindungsaufbau und Stille)
-v
Verbindungen melden
-4
nur IPv4
-6
nur IPv6

Verbindet Standardein- und -ausgabe mit einer TCP- oder UDP-Verbindung.

ersetzt: nc, ncat, socat, netcat, telnet

Status: fertig (Mac)

net network teilweise

Netzwerk-Profile verwalten und Netzstatus zeigen

net [status|list|show NAME|check NAME|set NAME SCHLÜSSEL WERT...|del NAME|up NAME|down NAME] [-v -q -n]

statt nmcli networkctl netplan networksetup

mehr
-v
ausführlich (zeigt auch das WLAN-Passwort, Zähler)
-q
still (nur Rückgabewert)
-n
nur zeigen, was passieren würde (up/down)

Ersetzt nmcli, networkctl, netplan, networksetup, netsh. Einfache Netzprofile und Netzstatus.

ersetzt: nmcli, networkctl, netplan, networksetup, scutil, netsh, netcfg, ifconfig, rc.conf, env http_proxy, networksetup -setwebproxy, netsh winhttp set proxy, net, scselect

Status: teilweise

nfs nfsinfo fertig

NFS-Server abfragen: Exporte, Clients und Einhängepunkte (MOUNT-Protokoll)

nfs [-e | -a | -d] [-p PORT] [-m PORT] [-w SEK] RECHNER | nfs -s | -S

statt showmount nfsstat

mehr
-e
Exportliste zeigen (Standard)
-a
Clients und Ordner (Rechner:Ordner) zeigen
-d
nur Ordner zeigen, die Clients eingehängt haben
-s
Kernel-Zähler des NFS-Clients zeigen (nfsstat -c)
-S
Einstellungen und Zähler des NFS-Servers im Kernel (nfsstat -s)
-p
Portmapper-Port (Standard 111)
-m
MOUNT-Port direkt angeben (ohne Portmapper)
-w
Zeitgrenze in Sekunden (Standard 5)

nfs RECHNER zeigt die Exportliste eines NFS-Servers (wie showmount -e), nfs -a RECHNER die Clients mit ihren Ordnern (showmount -a), nfs -d RECHNER nur die eingehängten Ordner (showmount -d).

ersetzt: showmount, nfsstat, nfsadmin

Status: fertig (Mac)

pc pcap fertig

Mitschnitte (pcap/pcapng) lesen, filtern, schreiben, zeilenweise entschlüsseln

pc [-qvexts] [-c N] [-i SCHNITTSTELLE] [-r DATEI] [-w DATEI] [FILTER...]

statt tcpdump tshark pktmon

mehr
-r
Mitschnitt aus DATEI lesen (pcap oder pcapng, - = Standardeingabe)
-w
passende Pakete in DATEI schreiben (.pcapng = pcapng, sonst pcap)
-c
nach N passenden Paketen aufhören
-i
Live-Mitschnitt auf SCHNITTSTELLE (nur nullos)
-q
keine Paketzeilen (nützlich mit -w oder -s)
-v
ausführlicher (TTL, Kennung, Fragmente)
-e
Ethernet-Adressen mit ausgeben
-x
Paketinhalt als Hexauszug
-t
absolute Zeit (UTC) statt Zeit seit dem ersten Paket
-s
am Ende Zusammenfassung nach Protokoll

Ersetzt tcpdump, tshark, pktmon, netsh trace. Langname: pcap.

ersetzt: tcpdump, tshark, pktmon, netsh trace

Status: fertig (Mac)

pi ping fertig

prüfen, ob ein Rechner antwortet (ICMP-Echo)

pi [-c ANZAHL] [-i SEK] [-W SEK] [-w SEK] [-s BYTES] [-t TTL] [-4|-6] [-q] ZIEL

statt ping ping6

mehr
-c
Anzahl Anfragen (Standard 4, 0 = bis Strg-C)
-i
Abstand in Sekunden (Standard 1)
-W
Wartezeit auf die letzte Antwort (Standard 2)
-w
nach so vielen Sekunden aufhören
-s
Datenbytes je Anfrage (Standard 56)
-t
TTL bzw. Hop-Limit
-4
nur IPv4
-6
nur IPv6
-q
nur Zusammenfassung

pi ZIEL schickt vier ICMP-Echo-Anfragen und zeigt Antworten, Verlust und Laufzeiten. IPv4 und IPv6 im selben Programm (die Adresse entscheidet, -4/-6 erzwingt eine Familie bei Namen).

ersetzt: ping, ping6

Status: fertig (Mac)

ppp ppp teilweise

PPP über eine serielle Leitung aushandeln (LCP, IPCP für IPv4, IPV6CP für IPv6)

ppp [-1 -v] [-a LOKAL:ENTFERNT] [-d DNS] [-W SEK] [GERÄT]

statt pppd

mehr
-1
nach der Aushandlung sauber auflegen
-a
eigene IPv4-Adresse und die für die Gegenseite (Server-Rolle)
-d
DNS-Server für die Gegenseite
-W
Zeitgrenze für die Aushandlung in Sekunden (Standard 30)
-v
jedes Steuerpaket zeigen

IP-Pakete nur gezählt, keine Anmeldung (PAP/CHAP), nicht gegen fremde PPP-Gegenstellen oder echte Modems getestet

ersetzt: pppd, rasdial, ppp, chat

Status: teilweise – Aushandlung fertig (Mac, zwei ppp gegeneinander über FIFOs); ohne Netzschnittstelle werden

ra routeradv teilweise

IPv6-Router: gelernte Router und Präfixe zeigen, Router-Solicitation senden

ra [-r | -p] [SCHNITTSTELLE] | ra -s [-W SEK] SCHNITTSTELLE

statt rdisc6 rtsol rtadvd

mehr
-r
nur Router
-p
nur Präfixe
-s
Router-Solicitation an ff02::2 senden und Antworten zeigen (Rechte nötig auf dem Mac)
-W
mit -s: so lange auf Antworten warten (Standard 3 s)

Router-Solicitation (-s) umgesetzt, auf dem Mac aber nur mit Rechten möglich und daher nur der Fehlerfall getestet; selbst Router-Ankündigungen senden (radvd) fehlt.

ersetzt: radvd, rdisc6, netsh interface ipv6, rtadvd, rtsol

Status: teilweise – Anzeigen der gelernten Router und Präfixe fertig (Mac, abgeglichen mit ndp -r/ndp -p);

rdp remotedesktop teilweise

Bildschirm fernsteuern (VNC/RFB): Server teilen, Bild holen

rdp serve [-1] [-p PORT] [-b ADRESSE] [-s BxH] [-f BILD.ppm] [-a DATEI]

statt vncviewer

mehr
-1
serve: nur einen Client bedienen, dann beenden
-p
serve: Port (Vorgabe 5900, 0 = frei wählen)
-b
serve: Adresse, IPv4 oder IPv6 (Vorgabe: 127.0.0.1 und ::1; "::" = alle)
-s
serve: Größe des Testbilds (Vorgabe 64x48)
-f
serve: Bild aus PPM-Datei teilen (wird bei Änderung neu gelesen)
-a
serve: Datei mit Anmeldedaten (benutzer:passwort je Zeile, plus ggf. eine Zeile VNC-Passwort; chmod 600)
-u
get: Benutzername (oder RDP_USER); Passwort aus RDP_PASS oder per Nachfrage
-a
get: Vorschau als Text ausgeben
-d
get: Farbtiefe anfordern (16 oder 32)
-k
get: Taste (X11-Keysym) drücken
-c
get: Mausklick bei X,Y

Ersetzt vncviewer, xfreerdp (Teil), mstsc (Teil). Spricht RFB 3.8 (VNC), Kodierung Raw, Farbtiefe 32 oder 16 Bit.

ersetzt: xfreerdp, vncviewer, open vnc://, Bildschirmfreigabe, mstsc, Remmina, quickassist

Status: teilweise

res resolver fertig

Namensauflösung: Einstellungen und Zwischenspeicher zeigen, abfragen, leeren

res [-a -q -v -n] [show | cache | get NAME [TYP] | put NAME TYP TTL WERT | flush [NAME] | purge | check]

statt resolvectl dscacheutil

mehr
-a
cache: auch abgelaufene zeigen; put: anhängen statt ersetzen
-q
still
-v
put: gespeicherten Eintrag zeigen
-n
nur zeigen, was passieren würde (flush, purge, put)

Ersetzt resolvectl, dscacheutil, scutil --dns, ipconfig /flushdns / /displaydns, resolvconf.

ersetzt: resolvectl, dscacheutil, scutil --dns, ipconfig /flushdns, /displaydns, resolvconf, local_unbound

Status: fertig (Mac)

rpc rpcinfo fertig

RPC-Dienste eines Rechners abfragen (Portmapper) und anpingen

rpc [-q] [dump|port|ping] HOST[:PORT]|[IPV6]:PORT [PROGRAMM VERSION]

statt rpcinfo rpcping

mehr
-q
still (ping: nur Exit-Code)

- rpc HOST[:PORT] (oder rpc dump …) listet alle beim rpcbind/Portmapper (Port 111) angemeldeten Dienste: Programm, Version, Netz-ID (tcp, tcp6, udp, udp6, local), Port, Name, Adresse (aus der Universaladresse; bei Portmapper v2 „-“). - rpc port HOST PROGRAMM VERSION gibt den TCP-Port eines Dienstes aus (0 = nicht registriert). - rpc ping HOST PROGRAMM VERSION fragt den Port ab und ruft die NULL-Prozedur des Dienstes auf (-q: nur Exit-Code).

ersetzt: rpcinfo, rpcping

Status: fertig (Mac)

rsy rsync fertig

Ordner abgleichen: nur Geändertes übertragen (Delta-Verfahren)

rsy [-r -c -n -v -q -u -W] [--delete] [--exclude=MUSTER] QUELLE... ZIEL

statt rsync robocopy

mehr
-r
rekursiv (Ordner); -a ist dasselbe
-c
Inhalt über Prüfsumme vergleichen statt Größe + Zeit
-n
nur zeigen, was passieren würde
-v
jede Änderung und eine Zusammenfassung anzeigen
-q
still
-u
neuere Dateien im Ziel nicht überschreiben
-W
ganze Dateien übertragen, kein Delta
--delete
im Ziel löschen, was in der Quelle fehlt
--exclude=MUSTER
Namen mit * und ? auslassen
--block-size=N
Blockgröße fürs Delta (Byte)

rsy [-r -c -n -v -q -u -W] [--delete] [--exclude=MUSTER] QUELLE... ZIEL

ersetzt: rsync, robocopy, openrsync

Status: fertig (Mac)

rt route teilweise

Routen anzeigen, nachschlagen, hinzufügen und entfernen

rt [-4 -6 -n] [get ZIEL | add ZIEL[/LÄNGE] via GATEWAY | del ZIEL[/LÄNGE]]

statt route

mehr
-4
nur IPv4
-6
nur IPv6
-n
nur zeigen, was geändert würde

Fehlermeldung ohne Rechte getestet.

ersetzt: ip route, route, netstat -rn, route print, netstat -r

Status: teilweise

scn portscan fertig

offene TCP-Ports eines Rechners finden (IPv4 und IPv6)

scn [-a -v -4 -6] [-p PORTS] [-W MS] RECHNER

statt nmap pscan

mehr
-p
Ports, z. B. 22,80,8000-8100 (Standard: 40 bekannte Dienste)
-a
alle Ports 1–65535
-v
auch geschlossene Ports zeigen
-W
Wartezeit je Port in Millisekunden (Standard 500)
-4
nur IPv4
-6
nur IPv6

Prüft mit normalen TCP-Verbindungen (kein Rohpaket-Trick, keine Rechte nötig), einen Port nach dem anderen, und zeigt offene Ports mit Dienstnamen. Rückgabe 0, wenn mindestens ein Port offen ist, sonst 1.

ersetzt: nmap, pscan

Status: fertig (Mac)

scp securecopy fertig

Dateien sicher übertragen (SFTP über SSH) und entfernte Ordner bearbeiten

scp [-r -v -q -n] [-P PORT -i SCHLÜSSEL -K HOSTDATEI] QUELLE... ZIEL

statt sftp securecopy

mehr
-r
Ordner mitsamt Inhalt
-v
jede Übertragung anzeigen
-q
still (keine Meldung über neue Hostschlüssel)
-n
nur zeigen, was übertragen würde
-l
entfernten Ordner auflisten
-s
sftp-Sitzung (Befehle von stdin: ls cd pwd get put mkdir rm rmdir rename chmod lcd lpwd quit)
-P
Port (Standard 22)
-i
Ed25519-Schlüsseldatei (Standard ~/.ssh/id_ed25519)
-K
Datei für bekannte Hostschlüssel (Standard ~/.nullos/known_hosts)

Entfernte Orte schreibt man [benutzer@]host:pfad. Hochladen (lokal → entfernt) und Herunterladen (entfernt → lokal, alle Quellen vom selben Host) wie bei c: Quelle → Ziel, -r für Ordner, -n Probelauf. In der Sitzung (-s): ls cd pwd get [-r] put [-r] mkdir rm [-r] rmdir rename chmod lcd lpwd quit.

ersetzt: scp, sftp

Status: fertig (Mac)

sk sockets fertig

offene TCP- und UDP-Sockets mit Programm anzeigen

sk [-t -u -l -s -4 -6] [PORT|PROGRAMM]

statt ss netstat sockstat lsof

mehr
-t
nur TCP
-u
nur UDP
-l
nur lauschende (Server-)Sockets
-s
Zusammenfassung je Protokoll und Zustand
-4
nur IPv4
-6
nur IPv6

Zeigt offene TCP- und UDP-Sockets mit lokaler Adresse, Gegenstelle, Zustand und Programm (Name und Prozessnummer).

ersetzt: ss, netstat, lsof -i, sockstat, nstat, ip -s, ifstat, netstat -s, nettop, typeperf, systat

Status: fertig (Mac)

smb smb teilweise

Dateien auf SMB-Freigaben (Windows/Samba/NAS) auflisten, holen und senden

smb [-v -q -n -f] [-u BENUTZER] [-d DOMÄNE] [-P PORT] ls|get|put|md|rm|mv ... smb://[benutzer@]host/freigabe/pfad

statt smbutil nmblookup

mehr
-u
Benutzername (sonst aus der Adresse oder $USER)
-d
Domäne/Arbeitsgruppe (Standard leer = lokales Konto)
-P
Port (Standard 445)
-f
vorhandene Ziele überschreiben
-n
nur zeigen, was passieren würde (keine Verbindung)
-v
ausführlich
-q
still

Das Passwort kommt aus $SMB_PASS (oder smb://benutzer:passwort@…, sichtbar in der Prozessliste – besser vermeiden). Benutzer: Adresse, -u oder $USER; -d Domäne, -P Port (445). get/put überschreiben nie ohne -f; -n zeigt nur, was passieren würde (ohne Verbindung). Ausgabe von ls: d|f Größe Datum Name (Ordner mit /).

ersetzt: nmblookup, smbclient, smbutil, nbtstat, net use, net view, net share

Status: teilweise

ssd sshserver fertig

SSH-Server: Anmeldung mit Schlüssel, Shell oder Befehl aus der Ferne

ssd [-1 -v -q] [-p PORT] [-l ADRESSE] [-k HOSTSCHLÜSSEL] [-a SCHLÜSSELLISTE] [-s SHELL] [-u BENUTZER] | ssd -T

statt sshd

mehr
-p
Port (Standard 22)
-l
Adresse zum Lauschen, IPv4 oder IPv6 (Standard: alle, IPv4 und IPv6)
-k
Hostschlüssel (Standard /etc/ssd/hostkey, wird angelegt, wenn er fehlt)
-a
erlaubte Schlüssel (Standard ~/.ssh/authorized_keys)
-s
Shell für Sitzungen und Befehle (Standard s)
-u
nur diesen Benutzernamen annehmen
-1
nur eine Verbindung bedienen, dann beenden
-v
ausführlich (zweimal: jedes Paket)
-q
still
-T
Selbsttest mit den offiziellen Krypto-Testvektoren

ssd ersetzt sshd. Man meldet sich mit einem Schlüssel an und bekommt unsere Shell s (mit Pseudo-Terminal) oder lässt einen Befehl laufen (ssh gerät 'befehl'). Gedacht für das erste Kleingerät (ESP32-C5, docs/esp32c5.md), das nur noch per SSH bedient wird.

ersetzt: sshd

Status: fertig (Mac)

ssh secureshell teilweise

sicher an einem anderen Rechner anmelden oder dort Befehle ausführen (SSH-2)

ssh [-v -t -T] [-p PORT] [-l NAME] [-i SCHLÜSSEL] [-k KNOWN_HOSTS] [-W SEK] [NAME@]RECHNER [BEFEHL…]

statt rsh rlogin rexec

mehr
-p
Port (Standard 22)
-l
Benutzername (Standard $USER)
-i
Schlüsseldatei (Standard ~/.ssh/id_ed25519)
-k
Datei der bekannten Rechner (Standard ~/.ssh/known_hosts)
-t
Terminal auf dem Server anfordern, auch mit Befehl
-T
kein Terminal anfordern
-W
Zeitgrenze in Sekunden für Aufbau und Antworten (Standard 30)
-v
Ablauf anzeigen

es fehlen weitere Verfahren, verschlüsselte Schlüsseldateien, Agent, Weiterleitungen und Neuverschlüsselung bei sehr langen Sitzungen.

ersetzt: ssh, rsh, rexec, rlogin, winrs

Status: teilweise

tra traceroute fertig

Weg zu einem Rechner Sprung für Sprung zeigen, mit -l fortlaufend (wie mtr)

tra [-l] [-c ANZAHL] [-u] [-n] [-4|-6] [-m MAX] [-f ERSTER] [-q SONDEN] [-w SEK] [-i SEK] [-p PORT] [-s BYTES] ZIEL

statt traceroute tracepath mtr traceroute6 tracert pathping

mehr
-l
fortlaufend messen und Tabelle aktualisieren (mtr)
-c
Durchläufe im Modus -l (Standard: endlos am Terminal, sonst 10)
-u
UDP-Sonden statt ICMP-Echo
-n
keine Namen auflösen
-4
nur IPv4
-6
nur IPv6
-m
höchste TTL (Standard 30)
-f
erste TTL (Standard 1)
-q
Sonden je Sprung (Standard 3)
-w
Wartezeit je Sonde in Sekunden (Standard 2)
-i
Abstand der Durchläufe im Modus -l (Standard 1)
-p
erster UDP-Zielport (Standard 33434)
-s
Datenbytes je Sonde

tra ZIEL zeigt den Weg zum Ziel Sprung für Sprung (Router, Laufzeiten). tra -l ZIEL misst fortlaufend und zeigt je Sprung Verlust und Laufzeiten wie mtr.

ersetzt: traceroute, tracepath, mtr, traceroute6, tracert, pathping

Status: fertig (Mac)

wg wireguard teilweise

WireGuard-Schlüssel erzeugen, Konfiguration prüfen, Tunnel-Handschlag im Userspace

wg genkey|genpsk|pubkey|selftest|show DATEI|run [-t SEK] [-s TEXT] DATEI

statt wg-quick wireguard.exe

mehr
-t
Wartezeit in Sekunden bei run (Standard 10)
-s
Text an das Gegenüber senden (macht diese Seite zum Initiator)
-v
mehr Ausgaben

wg (lang wireguard, Aliase wg-quick, wireguard.exe) ersetzt wg und wg-quick.

ersetzt: wg, wg-quick, wireguard.exe

Status: teilweise

wis whois fertig

Besitzer von Domänen, IP-Adressen und AS-Nummern abfragen

wis [-r -4 -6] [-h SERVER[:PORT]] [-p PORT] [-W SEK] FRAGE

statt whois

mehr
-h
Server (Standard whois.iana.org), auch ::1]:43
-p
Port (Standard 43)
-r
Verweisen nicht folgen
-4
nur IPv4
-6
nur IPv6
-W
Zeitgrenze in Sekunden (Standard 15)

Protokoll nach RFC 3912 (Frage + CRLF über TCP 43, Antwort bis Verbindungsende). Verweise („refer:“, „whois:“, „Registrar WHOIS Server:“, „ReferralServer:“) werden bis zu dreimal verfolgt, Kreise erkannt; der Weg steht auf stderr. Server als Name, IPv4, IPv6, [IPv6]:PORT oder NAME:PORT; Namen werden über A und AAAA aufgelöst und alle Adressen der Reihe nach probiert.

ersetzt: whois

Status: fertig (Mac)

wl wlan teilweise

WLAN: Netzliste, Suchen, Verbinden, Status

wl [-q -v -n] [status|list|check|scan|connect|disconnect|add|del] [NAME]

statt iw nmcli wpa_cli

mehr
-q
still (nur Rückgabewert / nur Namen)
-v
ausführlich (Passwörter bleiben trotzdem verdeckt)
-n
Probelauf bei connect/add/del: nur zeigen

gibt es erst auf nullos (Treiber fehlt, siehe docs/esp32c5.md). Auf dem Mac nur lesender Status.

ersetzt: iw, iwconfig, iwlist, nmcli, wpa_cli, networksetup, wdutil, airport, netsh wlan, ifconfig wlan, wpa_supplicant

Status: teilweise

13. Datenträger und Dateisysteme

atm automount teilweise

Laufwerke beim ersten Zugriff einhängen und bei Nichtbenutzung wieder aushängen

atm [-v -q -n] BEFEHL REGELDATEI [PUNKT|SEKUNDEN [ANZAHL]]

statt autofs automount

mehr
-v
jede Aktion anzeigen
-q
still
-n
nur zeigen, was passieren würde

Ersetzt autofs, systemd-automount, automount.

ersetzt: autofs, systemd-automount, automount

Status: teilweise

bak backup fertig

Sicherungen: dedupliziert, gepackt, mit Versionen (Snapshots)

bak init|save|list|ls|cat|restore|check|prune|gc|del [-v -n -f -q] LAGER ...

statt borg restic tmutil wbadmin

mehr
-v
jede Datei bzw. jeden Eintrag anzeigen
-n
nur zeigen, was passieren würde (Probelauf)
-f
beim Wiederherstellen vorhandene Dateien überschreiben
-q
still (bei list nur die Kennungen)

Ersetzt borg, restic, tmutil und wbadmin. Jede Sicherung ist ein vollständiger, unveränderlicher Stand (Snapshot); gleiche Inhalte liegen im Lager nur einmal und werden gepackt.

ersetzt: rsync, tar, borg, restic, tmutil, wbadmin, robocopy, ntbackup, dump, restore

Status: fertig (Mac)

btr btrfs teilweise

Btrfs-Abbild untersuchen (nur lesend)

btr info|chunks|sub|check|dump|ls|cat [-l -r] ABBILD [PFAD|BAUM]

statt btrfs

mehr
-l
ls: lange Liste (Rechte, Größe, Zeit)
-r
ls: Unterordner mitlisten

PFAD beginnt auf der obersten Ebene; @ID/pfad wählt Unterband ID. Unterbände im Pfad werden durchschritten.

ersetzt: btrfs

Status: teilweise

cnv convertfs teilweise

Dateisystem umwandeln, Inhalt, Name und Seriennummer bleiben (FAT12/16/32 untereinander)

cnv [-n -q] ZIEL[:N] fat12|fat16|fat32

statt btrfs-convert diskutil-convert convert

mehr
-n
nur prüfen, ob es passt
-q
still

cnv stick.img:1 fat32 packt den Inhalt in einen Zwischenordner ($TMPDIR/cnv.PID), legt das Dateisystem mit fs neu an, füllt es wieder und setzt Datenträgername und Seriennummer wie vorher. Vorher prüft ein Probelauf von fs, ob der neue Typ zur Größe passt – sonst bleibt alles unverändert. Schlägt das Neuanlegen fehl, bleibt der Zwischenordner liegen und cnv nennt ihn.

ersetzt: btrfs-convert, diskutil convert, convert, diskpart convert

Status: teilweise

cry cryptdisk teilweise

Verschlüsselte Datenträger erkennen und zeigen (FileVault-Status, LUKS1/2, BitLocker)

cry [-v] [ZIEL[:N]...]

statt cryptsetup fdesetup manage-bde

mehr
-v
mehr Einzelheiten (Nutzdatenbeginn, Schlüssellänge, Kopfgröße)

- cry zeigt die Systemverschlüsselung (Mac: FileVault an/aus über fdesetup status). - cry BILD[:N] erkennt LUKS1 und LUKS2 (Verfahren, Hash, belegte Schlüsselplätze, Kennung, Name) und BitLocker, wie cryptsetup luksDump – nur lesend, ohne Passwort.

ersetzt: cryptsetup, fdesetup, diskutil apfs encrypt, manage-bde, BitLocker, geli, gbde

Status: teilweise

dbf debugfs teilweise

FAT-Dateisystem untersuchen und von Hand ändern (Einträge, Ketten, löschen, Ordner anlegen)

dbf [-n] ZIEL[:N] ls|stat|cat|chain|fat|mkdir|rm [ARG]

statt debugfs fsdb

mehr
-n
nur zeigen, was rm/mkdir täte
-q
still

Zusammen mit fs -a/-x/-l lassen sich FAT-Abbilder ganz ohne Einhängen bearbeiten. ck und fsck_msdos sind nach rm/mkdir zufrieden. Unterschiede zu debugfs: kein Dialog, ein Befehl je Aufruf. Auf dem Mac nur Abbild-Dateien.

ersetzt: debugfs, fsutil, refsutil, fsdb

Status: teilweise

dfr defrag teilweise

Zerstückelte Dateien in einem FAT-Dateisystem zusammenhängend umlegen

dfr [-n -q -v] ZIEL[:N]

statt defrag e4defrag

mehr
-n
nur zeigen, was umgelegt würde
-q
still
-v
jede umgelegte Datei zeigen

dfr BILD[:N] sucht Dateien, deren Clusterkette aus mehreren Stücken besteht, und legt jede in den ersten freien zusammenhängenden Bereich, der groß genug ist. Reihenfolge je Datei: Daten kopieren → neue Kette in alle FATs → Verzeichniseintrag umstellen → alte Kette freigeben. Ein Abbruch dazwischen verliert also nichts (schlimmstenfalls findet ck verlorene Cluster).

ersetzt: e4defrag, defrag

Status: teilweise

io iostat teilweise

Ein- und Ausgabe der Datenträger: Summen seit dem Start oder Raten je Sekunde

io [-b -q] [SEKUNDEN [ANZAHL]]

statt iostat iotop fs_usage

mehr
-b
Bytes genau statt lesbar
-q
ohne Kopfzeile

- io zeigt je Datenträger die Summen seit dem Start: gelesen, geschrieben, Anzahl Lese-/Schreibvorgänge, mittlere Zeit je Vorgang, Fehler. - io 2 zeigt alle 2 Sekunden die Raten (Bytes/s, Vorgänge/s, ms je Vorgang, Anteil belegt); io 1 5 fünfmal.

ersetzt: iostat, typeperf "\PhysicalDisk\…", gstat, iotop, fs_usage, iosnoop, resmon, top -m io

Status: teilweise

lbl label teilweise

Datenträgername eines Dateisystems zeigen und ändern

lbl [-n -q] ZIEL[:N] [NAME]

statt e2label fatlabel dosfslabel label vol

mehr
-n
nur zeigen, was gesetzt würde
-q
nur den Namen ausgeben

lbl ZIEL zeigt Typ und Namen, lbl ZIEL NAME setzt ihn, lbl ZIEL "" löscht ihn. ZIEL ist ein Abbild oder BILD:N für Partition N.

ersetzt: e2label, fatlabel, swaplabel, diskutil rename, label, vol, dosfslabel, glabel

Status: teilweise

lop loop teilweise

Image-Dateien als Blockgeräte anmelden oder ansehen

lop [-r] -a DATEI | lop -d GERÄT | lop -l | lop DATEI

statt losetup

mehr
-a
Datei als Blockgerät anmelden (gibt den Gerätenamen aus)
-r
nur lesbar anmelden
-d
Gerät abmelden
-l
angemeldete Geräte auflisten
-q
still

lop DATEI zeigt Größe und Partitionstabelle (MBR oder GPT) eines Abbilds. lop -a [-r] DATEI meldet es als Blockgerät an und druckt den Gerätenamen (lo0, Partitionen lo0p1 …), lop -d GERÄT meldet ab, lop -l listet.

ersetzt: losetup, hdiutil attach, diskpart attach vdisk, mdconfig

Status: teilweise

rcv recover teilweise

Gelöschte Dateien in FAT finden, heraus retten oder im Abbild wiederherstellen

rcv [-q] ZIEL[:N] | rcv [-f] ZIEL[:N] PFAD DATEI | rcv -r [-n] ZIEL[:N] PFAD

statt undelete testdisk photorec extundelete

mehr
-r
im Abbild wiederherstellen (Eintrag und Clusterkette)
-n
nur zeigen, ob es ginge
-f
vorhandene Zieldatei überschreiben
-q
ohne Kopfzeile

(photorec-Art) fehlen

ersetzt: testdisk, photorec, ddrescue, recover, recoverdisk, extundelete, UNDELETE, UNFORMAT, MIRROR

Status: teilweise

rsz resizefs teilweise

Abbild, Partition und FAT-Dateisystem vergrößern oder verkleinern

rsz [-n -f -q] BILD GRÖSSE | rsz [-n -f -q] BILD:N GRÖSSE|+GRÖSSE|-GRÖSSE|max

statt resize2fs growfs fatresize

mehr
-n
nur zeigen, was passieren würde
-f
Partition auch ändern, wenn ein unbekanntes Dateisystem darin liegt
-q
still

und FAT über ihre Tabellengröße hinaus wachsen lassen fehlen

ersetzt: resize2fs, xfs_growfs, diskutil resizeVolume, diskpart extend, shrink, growfs

Status: teilweise

smt smart teilweise

Zustand der Datenträger: Modell, Firmware, Art, Anschluss, SMART-Status

smt [-a -q] [GERÄT...]

statt smartctl hdparm diskutil-info

mehr
-a
auch Abbilder und virtuelle Geräte
-q
ohne Hinweise

Rückgabe 1, wenn ein Datenträger „Failing“ meldet – so taugt smt für Prüfskripte. Seriennummern werden absichtlich nicht gezeigt. Die NVMe-/ATA-Einzelwerte (Temperatur, Abnutzung, Betriebsstunden) gibt macOS nur über ein IOKit-Plugin bzw. mit smartctl heraus; ohne Frameworks kommt smt da nicht hin.

ersetzt: hdparm, smartctl, camcontrol, diskutil info, wmic diskdrive get status

Status: teilweise

snp snapshot teilweise

Schnappschüsse eines Volumes anzeigen (anlegen/löschen später)

snp [-q] [VOLUME...] | snp new|del VOLUME

statt tmutil-localsnapshot vssadmin zfs-snapshot

mehr

nullos: braucht das eigene Dateisystem)

ersetzt: lvcreate -s, btrfs subvolume snapshot, tmutil localsnapshot, vssadmin, diskshadow, zfs snapshot, mksnap_ffs

Status: teilweise

swp swap teilweise

Auslagerung anzeigen, Auslagerungsbereich anlegen, ein- und ausschalten

swp [-q] | swp [-n -f -q] new ZIEL[:N] [NAME] | swp on|off ZIEL

statt mkswap swapon swapoff swapctl

mehr
-n
nur zeigen, was angelegt würde
-f
vorhandenes Dateisystem überschreiben
-q
still

- swp zeigt die Auslagerung: Ort, Größe, belegt, frei, verschlüsselt (Mac: vm.swapusage, Dateien in /System/Volumes/VM). - swp new BILD:N [NAME] schreibt eine Linux-Auslagerungskennung (Fassung 1, 4-KiB-Seiten, UUID, Name bis 16 Zeichen) – wie mkswap. bl zeigt den Namen. - swp on|off ZIEL schaltet ein und aus; macOS verwaltet das selbst, also auf dem Mac nur eine Meldung.

ersetzt: mkswap, swapon, swapoff, zramctl

Status: teilweise

tri trim teilweise

Freie Bereiche eines FAT-Dateisystems freigeben (Löcher in Abbildern) oder mit Nullen überschreiben

tri [-n -z -q -v] ZIEL[:N]

statt fstrim blkdiscard trimforce

mehr
-n
nur zeigen, was freigegeben würde
-z
mit Nullen überschreiben statt freigeben
-q
still
-v
jeden freien Bereich zeigen

tri BILD[:N] sucht alle freien Cluster einer FAT und gibt sie frei: Auf dem Mac stanzt es Löcher in die Abbild-Datei (fcntl F_PUNCHHOLE, ganze 4-KiB-Blöcke) – die Datei behält ihre Länge, belegt aber nur noch den Platz der echten Daten (im Test: 8 MB gelöschte Datei → Belegung sinkt um mehr als 7 MB). tri -z überschreibt die freien Cluster stattdessen mit Nullen (gut vor dem Packen oder Weitergeben eines Abbilds).

ersetzt: fstrim, blkdiscard, trimforce, defrag /L, fsutil behavior DisableDeleteNotify, trim

Status: teilweise

tun tunefs teilweise

Kenndaten eines Dateisystems zeigen und einstellen (FAT)

tun ZIEL[:N] | tun [-n -q] ZIEL[:N] serial XXXX-XXXX|neu | tun [-n] ZIEL[:N] state sauber|unsauber

statt dumpe2fs tune2fs dumpfs tunefs fsinfo

mehr
-n
nur prüfen, nichts schreiben
-q
still

tun BILD[:N] zeigt alle Kenndaten einer FAT: Hersteller, Name, Seriennummer, Sektor-/Clustergröße, Größe, frei, Lage der FATs und Daten, FSInfo, Ersatz-Startsektor, Medienbyte, Zustand. tun BILD serial 1A2B-3C4D (oder neu) setzt die Seriennummer (auch im Ersatz-Startsektor), tun BILD state sauber|unsauber den Merker „sauber getrennt“ (FAT16/32).

ersetzt: tune2fs, dumpe2fs, fsutil behavior, tunefs, dumpfs, fsutil, diskperf

Status: teilweise

wip wipefs fertig

Kennungen von Dateisystemen und Partitionstabellen finden und löschen

wip [-a -n -q] ZIEL[:N]...

statt wipefs

mehr
-a
alle gefundenen Kennungen löschen
-n
nur zeigen, was gelöscht würde
-q
still

wip BILD zeigt, welche Kennungen (Magic Bytes) wo liegen: GPT (Haupt- und Ersatzkopf, auch 4K-Sektoren), MBR/Schutz-MBR, FAT12/16/32 (samt Ersatz-Startsektor), exFAT, NTFS, ext2/3/4, HFS+, APFS, Linux-Swap, ISO 9660, btrfs, nullos. wip -a BILD[:N] überschreibt genau diese Bytes mit Nullen – danach erkennen bl, part, fs dort nichts mehr, die übrigen Daten bleiben unangetastet (wie wipefs -a).

ersetzt: wipefs, diskutil zeroDisk, diskpart clean, gpart destroy

Status: fertig (Mac)

14. Archive und Kompression

arc archive fertig

Archive packen, auspacken und zeigen (tar, cpio, zip; gzip, zlib, LZ4, zstd)

arc [-f -v -n -0..-9] ZIEL DATEI...  |  arc -x [-f -v -n] ARCHIV [ORDNER]  |  arc -l [-q] ARCHIV

statt tar cpio pax zip unzip

mehr
-x
auspacken (Format wird erkannt), ohne ORDNER in den aktuellen Ordner
-l
Inhalt zeigen (Rechte, Größe, Zeit, Name)
-t
prüfen, ob das Archiv heil ist (Prüfsummen), nichts schreiben
-f
vorhandenes Archiv bzw. vorhandene Dateien überschreiben
-v
jeden Eintrag zeigen
-n
nur zeigen, was gepackt bzw. ausgepackt würde
-q
bei -l nur die Namen
-0
zip: nur speichern … -1 schnell … -9 am stärksten packen (Standard -6)

arc ZIEL.tar.gz DATEI... packt Dateien und Ordner (mit Inhalt), das Format kommt aus der Endung. arc -x ARCHIV [ORDNER] packt aus (Format wird am Inhalt erkannt), arc -l ARCHIV zeigt den Inhalt, arc -t ARCHIV prüft nur. Ersetzt tar, cpio, pax, zip, unzip, ditto -c/-x -k.

ersetzt: tar, cpio, pax, zip, ditto -c -k, tar -a -c, unzip, ditto -x -k, tar -x, expand, 7z, 7za, unrar, cabextract, makecab, extract, diantz, EXPAND, dpkg-deb, rpm2cpio, pkgutil --expand

Status: fertig (Mac)

bdf bindiff fertig

Binäre Differenz erzeugen und anwenden (kleine Updates)

bdf [-a -f -v -n] ALT NEU DELTA | bdf -a ALT DELTA NEU

statt bsdiff bspatch xdelta

mehr
-a
Delta anwenden (ALT + DELTA -> NEU) statt erzeugen
-f
vorhandene Zieldatei überschreiben
-v
Größen und Anzahl der Stücke zeigen
-n
nur rechnen und zeigen, nichts schreiben

Ersetzt bsdiff, bspatch, xdelta.

ersetzt: bsdiff, xdelta, bspatch

Status: fertig (Mac)

lib library fertig

Archive (.a) aus Objektdateien anlegen, ändern und lesen

lib r|q|d|t|x|p[v][c] ARCHIV [DATEI...]

statt ar ranlib libtool

mehr
r
Dateien einfügen oder ersetzen (legt Archiv an)
q
Dateien hinten anhängen
d
Dateien löschen
t
Inhalt auflisten
x
Dateien auspacken
p
Dateien auf die Standardausgabe
v
ausführlich
c
Archiv ohne Hinweis anlegen

lib r ARCHIV DATEI... legt ein Archiv an bzw. fügt Dateien ein oder ersetzt sie, q hängt hinten an, d löscht, t listet (tv mit Größe und Datum), x packt aus, p schreibt auf die Standardausgabe. v = ausführlich, c = ohne Hinweis anlegen. Das führende - ist erlaubt (lib -rc …).

ersetzt: ar, lib, ranlib, libtool

Status: fertig (Mac)

mim mime fertig

MIME-Nachrichten mit Anhängen bauen, auflisten und auspacken

mim -e [-s BETREFF] [-f VON] [-t AN] [-m TEXT | -b DATEI] [DATEI...] | mim [-l | -p NR | -o ORDNER] NACHRICHT

statt mpack munpack makemime reformime

mehr
-e
Nachricht bauen und ausgeben (Anhänge als base64)
-s
Betreff (Umlaute werden als RFC-2047-Wort kodiert)
-f
Absender
-t
Empfänger
-m
Text der Nachricht
-b
Text der Nachricht aus Datei
-l
Teile der Nachricht auflisten
-p
Teil NR dekodiert auf die Standardausgabe
-o
Teile in diesen Ordner auspacken (Standard: hier)

Bauen: mim -e -s BETREFF -f VON -t AN -m "Text" datei1 datei2 > nachricht.eml schreibt eine mehrteilige MIME-Nachricht (Text plus Anhänge als base64 mit Dateiname und Typ nach Endung); -b DATEI nimmt den Text aus einer Datei. Umlaute im Betreff, Absender und Empfänger werden als RFC-2047-Wort kodiert (nur für kurze Werte; keine Zeilenfaltung).

ersetzt: munpack, mpack, makemime, reformime

Status: fertig (Mac)

zp compress fertig

Dateien packen und entpacken (gzip, zlib, LZ4; zstd nur entpacken)

zp [-d -c -k -l -t -f -v -L -Z -1..-9] [DATEI...]

statt gzip gunzip zcat lz4 unlz4 lz4cat unzstd zstdcat uncompress

mehr
-d
entpacken (Format wird erkannt: gzip, zlib, LZ4, zstd)
-c
auf die Standardausgabe schreiben, Dateien bleiben
-k
Eingabedatei behalten
-l
Größen und Format zeigen
-t
prüfen, ob die Datei heil ist
-f
vorhandene Ziele überschreiben, auch aufs Terminal schreiben
-v
Packquote zeigen
-L
als LZ4 packen (.lz4, sehr schnell)
-Z
als zlib packen (.zz)
-1
schnell packen … -9 am stärksten packen (Standard -6)

zp DATEI packt zu DATEI.gz und löscht das Original, zp -d DATEI.gz entpackt wieder. zp -c DATEI > x.gz schreibt auf die Ausgabe, zp -k behält die Eingabe, zp -l zeigt Größen und Format, zp -t prüft nur. -1 … -9 wählt die Stufe (Standard -6), -L packt als LZ4 (.lz4, sehr schnell), -Z als zlib (.zz). Ohne Datei: Standardeingabe → Standardausgabe.

ersetzt: gzip, gunzip, zcat, bzip2, bunzip2, bzcat, xz, unxz, xzcat, lzma, xzdec, zstd, unzstd, lz4, lzop, compress, uncompress, zcmp, zdiff, zgrep, zless, zmore, zcmp …, DBLSPACE, DRVSPACE

Status: fertig (Mac)

15. Entwicklung

a2l addr2line teilweise

Adresse in Funktionsname und Datei:Zeile übersetzen

a2l [-f -p -s -a -o] DATEI[@BASIS] [ADRESSE...]

statt addr2line atos

mehr
-f
Funktionsname vor Datei:Zeile ausgeben
-p
eine Zeile je Adresse: „funktion at datei:zeile“ (wie atos)
-s
nur den Dateinamen ohne Ordner
-a
Adresse vorne ausgeben
-o
Abstand zum Funktionsanfang anhängen (+0x…)

Ersetzt addr2line (Linux) und atos (macOS): übersetzt Adressen eines Programms in Funktionsname und datei:zeile. Hilfreich für Absturzberichte und Rückverfolgungen (trc, dbg).

ersetzt: addr2line, atos

Status: teilweise

adb androidbridge teilweise

Android-Geräte über TCP bedienen (Shell, Dateien) und kleiner adbd

adb [-s HOST[:PORT]] [-q] [-n] devices|connect|shell|exec-out|push|pull|ls|stat|wait-for-device|daemon …

statt adbd

mehr
-s
Gerät als HOST:PORT] oder IPv6]:PORT (sonst ANDROID_SERIAL oder erstes aus ADB_HOSTS)
-q
Fortschrittsmeldungen weglassen
-n
Standardeingabe nicht an die Gerät-Shell weitergeben

Eigener ADB-Client über TCP und ein kleiner adbd. Kein Hintergrunddienst (kein „adb server“): jeder Aufruf verbindet sich selbst mit dem Gerät.

ersetzt: adb, adbd

Status: teilweise

alt alternatives fertig

Wählen, welches Programm hinter einem Namen steckt

alt [-q -n] add|use|auto|rm|which|show|list [NAME] [PFAD] [PRIO] [LINK]

statt update-alternatives xcode-select xcrun

mehr
-q
still (keine Bestätigungen)
-n
nur zeigen, was geändert würde

Legt fest, welches Programm hinter einem Namen steckt, z. B. welcher Editor ed ist. Ersetzt update-alternatives, xcode-select, xcrun (Langname alternatives).

ersetzt: update-alternatives, xcode-select, xcrun

Status: fertig (Mac)

asm assemble fertig

Assembler für x86_64 (AT&T-Syntax) – schreibt ELF64- oder Mach-O-Objekte

asm [-v -m] [-o AUSGABE] EINGABE.s

statt as

mehr
-o
Ausgabedatei (Vorgabe: EINGABE mit .o)
-m
Mach-O statt ELF64 (zum Testen auf dem Mac)
-v
zeigen, was übersetzt wird

asm datei.s übersetzt GNU/AT&T-Assembler für x86_64 in eine ELF64-Objektdatei datei.o (für nullos). -o AUSGABE wählt den Namen, -m schreibt Mach-O statt ELF (zum Testen auf dem Mac mit Rosetta), -v zeigt, was passiert.

ersetzt: as, ml, ml64

Status: fertig (Mac)

bld buildsys fertig

Programme nach build.ninja bauen (parallel, mit Depfiles)

bld [-n -v -q] [-C ORDNER] [-f DATEI] [-j N] [-k N] [-t WERKZEUG] [ZIEL...]

statt ninja

mehr
-n
nur zeigen, was gebaut würde (Probelauf)
-v
Befehle statt Beschreibungen zeigen
-q
keine Fortschrittszeilen
-C
vorher in ORDNER wechseln
-f
DATEI statt build.ninja lesen
-j
N Befehle gleichzeitig (Standard 4)
-k
nach N Fehlern aufgeben (Standard 1, 0 = nie)
-t
Hilfswerkzeug: rules, targets all], commands ZIEL, clean

bld liest build.ninja und baut die genannten Ziele (sonst die default-Ziele, sonst alle Wurzeln) – parallel, mit Depfiles. Ersetzt ninja; Erzeuger wie cmake oder meson schreiben die build.ninja, bld führt sie aus. bld -n zeigt nur, was liefe, bld -j8 baut acht Dinge gleichzeitig, bld -C ordner arbeitet dort, bld --version meldet 1.11.1 (damit Erzeuger, die die ninja-Version prüfen, zufrieden sind).

ersetzt: cmake, ninja, meson, xcodebuild, msbuild

Status: fertig (Mac)

cfl cflow fertig

Aufrufgraph von C-Quelltext zeigen

cfl [-r -v -e -l] DATEI.c... [@FUNKTION...]

statt cflow

mehr
-r
umgekehrt: wer ruft die Funktion auf
-v
Datei:Zeile der Definition anzeigen
-e
auch nicht definierte (externe) Funktionen zeigen
-l
flach: eine Zeile "A -> B" je Aufruf

cfl DATEI.c... zeigt, welche Funktion welche aufruft, als eingerückten Baum ab main (gibt es kein main: ab allen Funktionen, die niemand aufruft). @NAME wählt eine andere Wurzel.

ersetzt: cflow

Status: fertig (Mac)

cx cppcompile teilweise

C++-Teilmenge übersetzen (über C und cc)

cx [-c -S -E -o AUS -I DIR -D NAME] QUELLE.cpp...

statt c++ g++ clang++ cl

mehr
-c
nur übersetzen, nicht binden
-S
Assembler erzeugen
-E
nur vorverarbeiten
-o
Ausgabedatei
--emit-c
nur das erzeugte C ausgeben

cx datei.cpp -o prog übersetzt eine Teilmenge von C++ nach C11 und lässt cc (Umgebungsvariable CX_CC, sonst cc) daraus Objekt/Programm bauen. Ersetzt c++, g++, clang++, cl.

ersetzt: c++, g++, clang++, cl

Status: teilweise

cxr cxref fertig

Querverweisliste für C-Quelltexte (wo steht welcher Name)

cxr [-c -s] [-w BREITE] [-o AUSGABE] DATEI...

statt cxref

mehr
-c
alle Dateien in einer Liste
-s
Dateinamen-Überschriften weglassen
-w
Zeilenbreite (Vorgabe 80)
-o
in Datei schreiben

cxr a.c b.c listet je Datei jeden Bezeichner mit Datei, umgebender Funktion (--- außerhalb) und allen Zeilennummern; * markiert Definitionen (Funktionen mit Körper, #define, Namen auf oberster Ebene). Parameter zählen zur Funktion. Kommentare, Zeichenketten und Schlüsselwörter werden übergangen. -c eine Liste über alle Dateien, -s ohne Dateiüberschriften, -w Zeilenbreite, -o Ausgabedatei. -I -D -U werden angenommen (ohne Wirkung).

ersetzt: cxref

Status: fertig (Mac)

dbg debug teilweise

Fehlersuche: Programme und Kernel über das GDB-Protokoll (z. B. QEMU -s) untersuchen

dbg [-q] [-p HOST:PORT] [ELF...]

statt gdb lldb windbg debug

mehr
-p
Ziel (GDB-Stub), Standard localhost:1234
-q
keine Eingabeaufforderung

Ersetzt gdb, lldb, windbg, DEBUG. Spricht das GDB-Remote-Protokoll mit einem Stub, vor allem QEMU (-s -S), und liest Symbole (Funktionen/Variablen) aus ELF64-Dateien, z. B. build/nk.elf.

ersetzt: gdb, lldb, cdb, windbg, ntsd, debug, DEBUG

Status: teilweise

dmg demangle fertig

verschlüsselte C++-Namen (Itanium-ABI, gcc/clang) lesbar machen

dmg [-p -n -_] [NAME...]

statt c++filt cxxfilt undname

mehr
-p
ohne Parameterliste
-n
Rückgabe 1, wenn ein Name nicht entschlüsselt werden kann
-_
Namen mit zusätzlichem _ (macOS) nicht annehmen

dmg _ZN3foo3barEv gibt foo::bar() aus. Ohne Namen wird die Standardeingabe gefiltert: jedes Wort, das mit _Z (oder __Z wie unter macOS) beginnt und sich entschlüsseln lässt, wird ersetzt – praktisch hinter obj -y oder in Fehlermeldungen des Linkers. -p lässt die Parameter weg, -n meldet Misserfolg über den Rückgabewert.

ersetzt: c++filt, undname, cxxfilt

Status: fertig (Mac)

dtc devicetree fertig

Gerätebäume übersetzen: Quelltext (.dts) in Binärform (.dtb) und zurück

dtc [-I dts|dtb] [-O dts|dtb] [-o AUSGABE] [-b CPU] [-p BYTES] [EINGABE]

statt dtc

mehr
-I
Eingabeformat (Vorgabe: am Inhalt erkannt)
-O
Ausgabeformat (Vorgabe: das andere)
-o
Ausgabedatei (Vorgabe Standardausgabe)
-b
boot_cpuid_phys im Kopf
-p
so viele Nullbytes Platz am Ende

dtc board.dts -o board.dtb übersetzt einen Gerätebaum in die Binärform (FDT, Fassung 17), die Bootlader und Kernel auf ARM-, RISC-V- und PowerPC-Geräten lesen; dtc board.dtb gibt ihn als Quelltext aus. Das Format wird am Inhalt erkannt (-I/-O zum Erzwingen).

ersetzt: dtc

Status: fertig (Mac)

dtr dtrace teilweise

Systemaufrufe und Funktionsaufrufe eines nullos-Programms verfolgen, zählen, Befehlsprofil

dtr [-s] [-f MUSTER | -F] [-c] [-p] [-n] [-o DATEI] PROGRAMM [ARGUMENT...]

statt dtrace bpftrace stap strace ltrace

mehr
-s
Systemaufrufe zeigen (Vorgabe)
-f
Funktionen, deren Name MUSTER enthält, mit Argumenten und Rückgabe zeigen
-F
alle Funktionen zeigen
-c
nur zählen: Systemaufrufe mit Fehlern, Aufrufe je Funktion
-p
Befehlsprofil: ausgeführte Befehle je Funktion
-n
nichts verfolgen, nur ausführen
-o
Spur in diese Datei

dtr prog arg... führt ein nullos-Programm in der CPU-Nachbildung von mck aus und zeigt jeden Systemaufruf wie strace, mit Namen aus docs/syscalls.md, lesbaren Zeichenketten und Fehlernamen:

ersetzt: bpftrace, systemtap, dtrace

Status: teilweise

elf elfbrand fertig

Betriebssystem-Kennung (EI_OSABI) von ELF-Dateien zeigen oder setzen

elf [-n -v] [-t NAME|ZAHL] DATEI...   |   elf -l

statt brandelf elfctl

mehr
-t
Kennung setzen (Name wie FreeBSD/Linux/SYSV oder Zahl)
-n
nur zeigen, was geändert würde
-v
jede Änderung zeigen
-l
bekannte Kennungen zeigen

elf prog zeigt die Betriebssystem-Kennung EI_OSABI (Byte 7 des ELF-Kopfs), elf -t FreeBSD prog setzt sie (Name ohne Rücksicht auf Groß-/Kleinschreibung oder Zahl 0–255), -n zeigt nur, was passieren würde, -l listet die bekannten Kennungen. nullos-Programme haben SYSV (0).

ersetzt: brandelf, elfctl

Status: fertig (Mac)

err errno fertig

Fehlercodes und Signale von nullos erklären

err [-s] NUMMER|NAME|TEXT...   |   err -l [-s]

statt errno perror

mehr
-l
alle zeigen
-s
Signale statt Fehlercodes

err 2, err -2, err ENOENT, err enoent oder err Ordner (Text suchen) zeigen Nummer, Name und deutsche Erklärung eines nullos-Fehlercodes (Werte aus include/nullos/sys.h, wie Linux). -s dasselbe für Signale (err -s 11, err -s INT), -l listet alle.

ersetzt: errno, perror, net helpmsg, certutil -error

Status: fertig (Mac)

idt ident fertig

RCS-Schlüsselwörter ($Id: … $) oder SCCS-Kennzeichen (@(#)) in Dateien zeigen

idt [-q -w] [DATEI...]

statt ident what

mehr
-q
keine Meldung bei Dateien ohne Kennzeichen
-w
SCCS-Kennzeichen hinter @(#) wie what

idt datei... zeigt alle RCS-Schlüsselwörter der Form $Name: Text $ (auch in Programmen und Objektdateien), idt -w die SCCS-Kennzeichen hinter @(#) (bis ", >, Zeilenende, \ oder Nullbyte) wie what. Ohne Datei wird die Standardeingabe gelesen. Rückgabe 1, wenn in einer Datei nichts gefunden wurde (-q: ohne Meldung).

ersetzt: ident, what

Status: fertig (Mac)

ind indent fertig

C-Quelltext einheitlich einrücken (nullos-/Linux-Stil, Tabs)

ind [-w -n -q -s -c -a] [-i N] [DATEI...]

statt indent

mehr
-w
Dateien selbst ändern (sonst Ausgabe auf die Standardausgabe)
-n
nur prüfen: Rückgabe 1, wenn eine Datei anders eingerückt ist
-q
mit -n: keine Meldung
-s
Leerzeichen nach if/for/while/switch und vor { ergänzen
-c
case eine Ebene tiefer als switch
-a
Fortsetzungszeilen mit Leerzeichen ausrichten (Tabs nur bis zur Ebene)
-i
N Leerzeichen je Ebene statt Tab

ind datei.c gibt die Datei neu eingerückt aus, -w schreibt sie zurück, -n prüft nur (Rückgabe 1, wenn sich etwas ändern würde – für Prüfläufe). Stil wie in nullos (Linux/K&R): ein Tab je Blockebene, case auf Höhe von switch (-c: eine Ebene tiefer), Sprungmarken ganz links, Anweisungen ohne Klammern nach if/for/while/else/do eine Ebene tiefer (auch verschachtelt, else findet sein if), Fortsetzungszeilen und mehrzeilige Initialisierer unter der offenen Klammer ausgerichtet – mit möglichst vielen Tabs, mit -a Tabs nur bis zur Ebene und dann Leerzeichen. Kommentarzeilen ( * …) und Präprozessorzeilen bleiben, wie sie sind; Leerraum am Zeilenende fällt weg. -i 4 rückt mit Leerzeichen ein. -s setzt fehlende Leerzeichen (if( → if (, ){ → ) {).

ersetzt: indent

Status: fertig (Mac)

ld linker fertig

Objektdateien zu einem statischen x86_64-ELF-Programm binden

ld [-v] [-o AUSGABE] [-T ADRESSE] [-e SYMBOL] [-L ORDNER] OBJEKT... [-lNAME]

statt ld.lld link

mehr
-o
Ausgabedatei (Vorgabe a.out)
-T
Startadresse des Codes (Vorgabe 0x400000; auch -Ttext=ADR)
-e
Einsprungsymbol (Vorgabe _start)
-L
Ordner für -l durchsuchen
-l
Bibliothek libNAME.a dazunehmen
-v
zeigen, was gebunden wird

ld -o prog start.o a.o b.o -L lib -lfoo bindet ELF64-Objekte (x86_64) zu einem statischen Programm. -T ADRESSE (auch -Ttext=ADR) legt die Startadresse fest (Vorgabe 0x400000), -e SYMBOL den Einsprung (Vorgabe _start), -v zeigt, welche Archiv-Mitglieder genommen werden.

ersetzt: ld, ld.lld, gold, link

Status: fertig (Mac)

ldc ldconfig fertig

Bibliotheksordner einlesen: SONAME-Verweise anlegen, Zwischenspeicher für ldd und Lader schreiben

ldc [-n -v -q] [ORDNER...]   |   ldc -p

statt ldconfig

mehr
-n
nur zeigen, was passieren würde
-v
jeden Verweis und die Anzahl zeigen
-q
still (keine Warnungen)
-p
Zwischenspeicher anzeigen

ldc liest alle gemeinsamen Bibliotheken (ELF, Art DYN, mit DT_SONAME) in den Ordnern aus /etc/ld.conf (ein Ordner je Zeile, # für Bemerkungen) sowie /lib und /usr/lib, oder in den angegebenen Ordnern. Für jede legt es den Verweis SONAME -> Datei an (z. B. libb.so.1 -> libb.so.1.10; bei mehreren Fassungen im selben Ordner gewinnt die höchste, Zahlen als Zahlen verglichen) und schreibt den Zwischenspeicher /etc/ld.cache: eine Textzeile SONAME PFAD je Bibliothek, nach Namen sortiert. ldd liest ihn. ldc -p zeigt ihn.

ersetzt: ldconfig, update_dyld_shared_cache

Status: fertig (Mac)

ldd libdeps fertig

gemeinsame Bibliotheken eines Programms zeigen (ohne es auszuführen)

ldd [-d -v] PROGRAMM...

statt otool-L

mehr
-d
nur direkte Abhängigkeiten
-v
als Baum (jede Ebene eingerückt, Wiederholungen mit)

ldd prog zeigt den Lader (PT_INTERP) und alle gemeinsamen Bibliotheken, die prog braucht, mit dem Pfad, unter dem sie gefunden werden – auch die Abhängigkeiten der Bibliotheken (jede nur einmal). -d nur die direkten, -v als eingerückter Baum. Rückgabe 1, wenn eine Bibliothek fehlt.

ersetzt: ldd, otool -L, dumpbin /dependents

Status: fertig (Mac)

lex lexer fertig

Scanner-Generator: lex-Beschreibung (Muster + Aktionen) in einen C-Scanner übersetzen

lex [-t -v -l -i] [-o AUSGABE.c] BESCHREIBUNG.l

statt lex flex

mehr
-o
Ausgabedatei (Vorgabe lex.yy.c)
-t
auf die Standardausgabe schreiben
-v
Zahlen zu Zuständen und Zeichenklassen zeigen
-l
keine #line-Zeilen
-i
Groß- und Kleinschreibung gleich behandeln

lex datei.l schreibt lex.yy.c mit int yylex(void). Bei mehreren passenden Mustern gewinnt der längste Treffer, bei gleicher Länge die frühere Regel; was keine Regel trifft, wird ausgegeben (ECHO).

ersetzt: lex, flex

Status: fertig (Mac)

lip lipo in Arbeit

Mach-O-Universaldateien (mehrere Architekturen) bauen, zerlegen und ansehen

lip -i DATEI... | -a DATEI | -c -o AUSGABE DATEI... | -t ARCH -o AUSGABE DATEI | -x ARCH -o AUSGABE DATEI | -r ARCH -o AUSGABE DATEI | -v ARCH... DATEI

statt lipo

mehr
-i
Architekturen mit Versatz/Größe zeigen (lipo -info/-detailed_info)
-a
nur Architekturnamen
-c
Universaldatei aus Einzeldateien bauen
-t
eine Architektur als Einzeldatei herausholen (lipo -thin)
-x
Universaldatei nur mit diesen Architekturen
-r
Architektur entfernen
-v
prüfen, ob Architekturen enthalten sind (Rückgabe 0/1)
-o
Ausgabedatei

Baut und zerlegt Mach-O-„fat“-Dateien, die mehrere Architekturen enthalten (z. B. x86_64 und arm64 für macOS):

ersetzt: lipo

Status: in Arbeit

m4 macro fertig

Makroprozessor (POSIX m4 mit GNU-Ergänzungen)

m4 [-D NAME[=WERT]] [-U NAME] [DATEI...]

statt m4 gm4

mehr
-D
Makro NAME definieren (Wert leer oder WERT)
-U
Makro NAME (auch eingebautes) entfernen

m4 [-D NAME=WERT] [-U NAME] datei.m4 ... liest die Dateien (oder die Standardeingabe, auch -) und ersetzt Makros.

ersetzt: m4

Status: fertig (Mac)

mck memcheck teilweise

nullos-Programm in einer CPU-Nachbildung ausführen und Speicherfehler sowie Lecks finden

mck [-q -v -s -e] PROGRAMM [ARGUMENT...]

statt valgrind leaks

mehr
-q
nur Fehler und Lecks melden
-v
mehr Angaben (Fundstellen von malloc/free, Zahl der Befehle)
-s
jeden Systemaufruf zeigen
-e
Rückgabe 99, wenn Fehler oder Lecks gefunden wurden

mck prog arg... führt ein statisches nullos-Programm (x86_64-ELF, ET_EXEC oder statisches PIE) in einer eigenen CPU-Nachbildung aus – auf dem Mac genauso wie später auf nullos. Systemaufrufe nach docs/syscalls.md werden an den Gastgeber weitergereicht (Dateien, Rohre, Uhr, spawn startet das Kind wieder unter mck). Rückgabewert und Ausgabe sind die des Programms.

ersetzt: valgrind, leaks

Status: teilweise

mk make fertig

Programme nach Regeln aus einem Makefile bauen

mk [-n -s -k -i -B -q -r -w] [-C ORDNER] [-f DATEI] [-j N] [VAR=WERT...] [ZIEL...]

statt make gmake bmake nmake

mehr
-n
nur zeigen, welche Befehle laufen würden (Probelauf)
-s
Befehle nicht anzeigen (still)
-k
nach Fehlern mit anderen Zielen weitermachen
-i
Fehler von Befehlen übergehen
-B
alles neu bauen, auch Aktuelles
-q
nichts tun, Rückgabe 1 wenn etwas veraltet ist
-r
keine eingebauten Regeln (%.o aus %.c usw.)
-w
Ordnerwechsel anzeigen
-C
vorher in ORDNER wechseln
-f
DATEI statt Makefile lesen
-j
N Befehle gleichzeitig (ohne N: so viele wie möglich)

mk liest GNUmakefile, makefile oder Makefile und baut die genannten Ziele (sonst das erste). mk -n host zeigt nur die Befehle, mk -j8 host baut acht Dinge gleichzeitig, mk -C ordner arbeitet dort. Ersetzt make, gmake, bmake, nmake. Ziel: nullos baut sich damit selbst – mk -n host im Projektordner zeigt dieselben Befehle wie GNU make (steht im Test).

ersetzt: make, nmake

Status: fertig (Mac)

mkd makedepend fertig

Abhängigkeiten von C-Dateien (#include) für make ermitteln

mkd [-s -q] [-I ORDNER]... [-p VORSILBE] [-x ENDUNG] [-o AUSGABE | -f MAKEFILE] DATEI...

statt makedepend mkdep

mehr
-I
Ordner für Kopfdateien
-s
auch /usr/include und /usr/local/include durchsuchen
-q
fehlende Kopfdateien nicht melden
-p
Vorsilbe vor dem Objektnamen (z. B. obj/)
-x
Endung des Objekts (Vorgabe .o)
-o
in diese Datei schreiben (wie mkdep, .depend)
-f
Makefile ab der Zeile „# DO NOT DELETE“ ersetzen (wie makedepend)

mkd -I inc src/*.c schreibt je Quelldatei eine Zeile datei.o: datei.c kopf.h … (lange Zeilen mit \ umbrochen) – wie cc -MM. #include "…" wird zuerst im Ordner der einbindenden Datei gesucht, dann in den -I-Ordnern; #include <…> nur in -I-Ordnern (mit -s auch in den Systemordnern). Jede Kopfdatei steht nur einmal da, Pfade werden vereinfacht (a/../b → b).

ersetzt: makedepend, mkdep

Status: fertig (Mac)

obj objinfo fertig

Objektdateien, Programme und Archive ansehen (Kopf, Abschnitte, Symbole, Größen)

obj [-h -s -l -r -y -z -a -d] [-x ABSCHNITT] DATEI...

statt nm size objdump readelf otool dumpbin

mehr
-h
Dateikopf (Format, Art, Maschine, Einsprung)
-s
Abschnitte
-l
Programmköpfe (Segmente)
-r
Verschiebungen (Relocations)
-y
Symbole wie nm (nach Namen sortiert)
-z
Größen wie size (text data bss)
-d
Maschinencode disassemblieren (x86_64)
-a
alles außer -z und -d
-x
Inhalt eines Abschnitts als Hex anzeigen

Ein Werkzeug für das, was sonst nm, size, readelf, objdump und otool tun:

ersetzt: nm, dumpbin /symbols, size, objdump, otool, dumpbin, readelf, vtool, elfdump

Status: fertig (Mac)

ocp objcopy fertig

ELF-Dateien umbauen: Abschnitte entfernen, Symbole und Debug-Daten abstreifen, Rohdaten schreiben

ocp [-s -g -b -v] [-j ABSCHNITT] [-R ABSCHNITT] EINGABE [AUSGABE]

statt objcopy strip elfcopy

mehr
-s
abstreifen wie strip (Debug-Daten; bei Programmen auch Symbole)
-g
nur Debug-Daten abstreifen
-b
Rohdaten der Ladeabschnitte schreiben (objcopy -O binary)
-j
nur diesen Abschnitt behalten (mehrfach möglich)
-R
diesen Abschnitt entfernen (mehrfach möglich)
-v
zeigen, was entfernt wird

Ohne AUSGABE wird die Eingabe ersetzt (über eine Zwischendatei EINGABE.ocp-tmp, dann umbenannt). Eine vorhandene AUSGABE wird überschrieben – wie bei Compiler und Linker, weil ocp in Bauabläufen läuft.

ersetzt: objcopy, editbin, elfcopy, strip

Status: fertig (Mac)

pkc pkgconfig fertig

Übersetzer- und Linker-Schalter installierter Bibliotheken aus .pc-Dateien

pkc [--cflags --libs --static --modversion --exists --variable=NAME --define-variable=N=W --atleast-version=V] PAKET [OP FASSUNG]...  |  pkc --list-all

statt pkg-config pkgconf

mehr
--cflags
Schalter fürs Übersetzen (-I, -D)
--libs
Schalter fürs Binden (-L, -l)
--static
auch Requires.private und Libs.private
--modversion
Fassung zeigen
--exists
nur prüfen (Rückgabe 0/1)
--variable
Wert einer Variablen
--list-all
alle Pakete

pkc --cflags --libs zlib nennt die Schalter, mit denen man gegen eine installierte Bibliothek übersetzt. Gelesen werden NAME.pc aus $PKG_CONFIG_PATH, dann aus $PKG_CONFIG_LIBDIR (Vorgabe /usr/local/lib/pkgconfig, /usr/local/share/pkgconfig, /usr/lib/pkgconfig, /usr/share/pkgconfig, /lib/pkgconfig); ein Pfad auf eine .pc-Datei geht auch. Variablen ${name} (auch ${pcfiledir}), Requires mit Bedingungen (a >= 1.2, b), bei --static zusätzlich Requires.private/Libs.private. Gleiche Schalter erscheinen nur einmal. Fassungen werden wie bei pkg-config verglichen (Zahlen als Zahlen: 1.10 > 1.9).

ersetzt: pkg-config, pkgconf

Status: fertig (Mac)

rcs oldvcs teilweise

einzelne Dateien versionieren im RCS-Format (DATEI,v): einchecken, auschecken, Verlauf, Unterschiede

rcs ci [-m TEXT] [-t BESCHREIBUNG] DATEI... | rcs co [-r FASSUNG] [-p] [-f] DATEI... | rcs log DATEI... | rcs diff [-r F1 [-r F2]] DATEI...

statt ci co rlog rcsdiff

mehr
-m
Text zur neuen Fassung (ci)
-t
Beschreibung der Datei (ci, beim ersten Mal)
-r
Fassung (co, diff)
-p
auf die Standardausgabe statt in die Datei (co)
-f
ungesicherte Änderungen überschreiben (co)

rcs ci -m "Text" datei legt eine neue Fassung in datei,v an (oder in RCS/datei,v, wenn es den Ordner RCS gibt): 1.1, 1.2, … Die neueste Fassung steht ganz in der Datei, ältere als Rückwärts-Deltas (Myers-Diff, ed-artige Befehle dN M/aN M) – das Format von RCS 5 (rcsfile(5)). rcs co [-r 1.2] datei holt eine Fassung zurück und füllt dabei $Id$ $Header$ $Revision$ $Date$ $Author$ $State$ $RCSfile$ $Source$ aus; -p schreibt auf die Standardausgabe. Eine Arbeitsdatei mit ungesicherten Änderungen wird nur mit -f überschrieben. rcs log datei zeigt den Verlauf, rcs diff [-r A [-r B]] datei den Unterschied (einheitliches Format; ohne -r B zur Arbeitsdatei, Rückgabe 1 bei Unterschied). Als ci, co, rlog, rcsdiff aufgerufen (Verweis) geht es auch ohne Unterbefehl.

ersetzt: rcs, cvs, svn, SCCS

Status: teilweise – ohne Zweige, Sperren und symbolische Namen

sgn sign teilweise

Dateien mit Ed25519 signieren und Signaturen prüfen (signify-Format)

sgn -G [-n] [-c KOMMENTAR] -p ÖFFENTLICH -s GEHEIM | sgn -S [-e] -s GEHEIM -m DATEI [-x SIGNATUR] | sgn -V [-e -q] -p ÖFFENTLICH -m DATEI [-x SIGNATUR]

statt signify minisign

mehr
-G
Schlüsselpaar erzeugen
-S
signieren
-V
prüfen
-p
öffentlicher Schlüssel
-s
geheimer Schlüssel
-m
Nachricht (Datei)
-x
Signaturdatei (Vorgabe DATEI.sig)
-e
Nachricht in die Signaturdatei einbetten bzw. daraus auspacken
-c
Kommentar für die Schlüssel
-q
still
-n
ohne Kennwort (hier immer)

Gleiche Dateiformate wie OpenBSD signify: Ed25519, jede Datei aus einer Zeile untrusted comment: … und einer Zeile Base64. Damit lassen sich nullos-Abbilder und Pakete signieren und prüfen.

ersetzt: codesign, signtool, apksigner, gpg --verify, codesign -v, spctl -a, signtool verify, signify

Status: teilweise – ohne Kennwortschutz der geheimen Schlüssel, ohne Prüfsummenlisten (-C)

tag ctags fertig

Namensverzeichnis (tags/TAGS) für Editoren aus C-, Shell- und make-Dateien

tag [-e -R -x -a] [-f AUSGABE] DATEI|ORDNER...

statt ctags etags

mehr
-e
etags-Format (TAGS, für Emacs)
-R
Ordner durchsuchen
-x
Liste auf die Standardausgabe (Name Art Zeile Datei Text)
-a
an vorhandene Datei anhängen
-f
Ausgabedatei (- = Standardausgabe)

tag *.c *.h schreibt tags im Format von Exuberant/Universal Ctags (sortiert, Suchmuster /^Zeile$/, Art als Buchstabe), das vi/vim/e direkt lesen. -e schreibt TAGS für Emacs, -x eine lesbare Liste, -R durchsucht Ordner, -a hängt an (Einträge werden neu sortiert), -f - schreibt auf die Standardausgabe.

ersetzt: ctags, etags

Status: fertig (Mac)

tst testrun fertig

Testdateien finden, ausführen und zusammenfassen

tst [-v -q] [-b PROGRAMMORDNER] [-j N] [ORDNER|DATEI...]

statt kyua atf-run prove

mehr
-b
cmd/NAME/test.sh bekommt PROGRAMMORDNER/NAME als Argument
-j
N Tests gleichzeitig
-v
bei Fehlern die letzten 10 Ausgabezeilen zeigen
-q
nur Fehler und Zusammenfassung

tst [ORDNER|DATEI...] sucht Testdateien (test.sh, *_test.sh, test_*.sh, rekursiv; ohne Angabe im aktuellen Ordner), führt jede mit sh aus und zeigt je Test „bestanden“ oder „FEHLER“ mit Laufzeit, am Ende die Summe. Bestanden heißt: Rückgabe 0 und letzte Ausgabezeile ok (oder gar keine Ausgabe) – so wie bei nullos make test.

ersetzt: kyua, atf

Status: fertig (Mac)

vc versioncontrol teilweise

Versionsverwaltung, Git-kompatibel (Lager von git und vc sind gegenseitig lesbar)

vc BEFEHL [OPTIONEN] [ARGUMENTE]

statt git cvs

mehr
-q
still (i, c, cl)
-f
erzwingen (a: ignorierte Datei, co/rs: Änderungen verwerfen, pu: nicht vorspulbar, b/t: überschreiben)
-n
nacktes Lager (i, cl)

Ersetzt git und cvs. Von null an geschrieben, aber im Git-Format: Objekte (zlib + SHA-1), Index (DIRC Fassung 2, liest auch 3), Verweise samt packed-refs, Packdateien. Ein Lager von vc ist ein Git-Lager und umgekehrt: git fsck --strict nimmt unsere Lager an, vc liest von git gepackte Lager (mit Deltas). Bei gleichem Inhalt, Namen und Datum entstehen dieselben Commit-SHAs wie bei git.

ersetzt: git, cvs

Status: teilweise

yac yacc fertig

LALR(1)-Parsergenerator: yacc-Grammatik in einen C-Parser übersetzen

yac [-d -v -l -t] [-b VORSILBE] [-o AUSGABE.c] GRAMMATIK.y

statt yacc bison byacc

mehr
-d
Kopfdatei mit Tokennummern und YYSTYPE (y.tab.h)
-v
Beschreibung der Zustände und Konflikte (y.output)
-l
keine #line-Zeilen
-t
Ablaufverfolgung einbauen (YYDEBUG 1, dann yydebug = 1 setzen)
-b
Vorsilbe der Ausgabedateien statt y
-o
Name der C-Ausgabe (Kopfdatei und Beschreibung daneben)

yac -d grammatik.y schreibt y.tab.c (den Parser int yyparse(void)) und y.tab.h; -v dazu y.output mit allen Zuständen, Regeln und Konflikten. -o parser.c legt parser.h/parser.output daneben, -b x nimmt x statt y. -l ohne #line, -t mit Ablaufverfolgung (yydebug = 1).

ersetzt: yacc, bison, byacc

Status: fertig (Mac)

16. Editoren

sue sudoedit teilweise

Datei über eine Kopie bearbeiten und danach zurückschreiben

sue DATEI

statt sudoedit visudo

mehr

sue /etc/hosts kopiert die Datei in einen privaten Temp-Ordner, startet den Editor ($VISUAL, $EDITOR, sonst e) auf der Kopie und schreibt das Ergebnis erst danach über eine Zwischendatei und rename zurück — nie eine halbe Datei, keine Verweise (Symlinks), kein Editor mit Sonderrechten. Endet der Editor mit Fehler oder gibt es keine Änderung, bleibt die Datei unberührt.

ersetzt: sudoedit, visudo

Status: teilweise

17. Monitoring und Leistung

crs crashreport fertig

Absturzberichte auflisten und lesen (Ausnahme, Aufrufkette mit Quellzeilen)

crs [-d ORDNER] [-n ANZAHL] [MUSTER] | crs [-d ORDNER] -v NR|DATEI

statt coredumpctl ReportCrash apport werfault

mehr
-n
so viele neueste Berichte (Standard 20)
-v
einen Bericht im Detail (Nummer aus der Liste oder Datei)
-d
Berichte aus diesem Ordner statt den Systemordnern

Liste neuester zuerst (Art: Absturz, Hänger, Speicher, Ressourcen), crs NAME filtert nach Programm, crs -v NR zeigt Ausnahme, Endgrund und die Aufrufkette des abgestürzten Threads – mit Quelldatei und Zeile, wenn das Programm mit Symbolen gebaut ist. Gut zum schnellen Nachsehen, warum ein nullos-Werkzeug auf dem Mac abstürzt.

ersetzt: coredumpctl, apport, ReportCrash, werfault, savecore, crashinfo

Status: fertig (Mac)

hng hangdiag fertig

hängt ein Prozess? abtasten und zeigen, wo er steckt

hng [-r] [-t SEK] [-z TIEFE] PID

statt spindump sample

mehr
-t
so viele Sekunden abtasten (Standard 2)
-z
so viele Aufrufe je Thread zeigen (Standard 8, vom tiefsten aus)
-r
vollständigen Bericht ausgeben

hng PID tastet den Prozess 2 s lang ab (-t) und zeigt je Thread den häufigsten Aufrufpfad (die letzten 8 Aufrufe, -z) und die Funktionen, in denen er am meisten steckt. Ein hängendes Programm wartet meist in read, __psynch_mutexwait (Sperre) oder __semwait_signal (Schlafen) – oder rechnet in einer eigenen Schleife. -r gibt den ganzen Bericht aus.

ersetzt: sysrq, dmesg, spindump, sample, ddb

Status: fertig (Mac)

ipo ipcobjects fertig

IPC-Objekte zeigen, anlegen, löschen (gemeinsamer Speicher, Semaphoren, Schlangen)

ipo | ipo -m GRÖSSE | -s ANZAHL | -q [-k SCHLÜSSEL] | ipo -d ART:ID...

statt ipcs ipcmk ipcrm lsipc

mehr
-m
gemeinsamen Speicher anlegen (K/M erlaubt)
-s
Semaphoren-Satz anlegen
-q
Nachrichtenschlange anlegen
-k
Schlüssel statt privat (0x… erlaubt)
-d
löschen: m:ID, s:ID, q:ID

ipo listet System-V-IPC-Objekte (Art, ID, Schlüssel, Rechte, Besitzer, Größe). ipo -m 8K, ipo -s 3, ipo -q [-k 0x1234] legen an und geben ART:ID aus, das ipo -d direkt wieder versteht: x=$(ipo -m 1M); …; ipo -d $x. Hängengebliebene Objekte abgestürzter Programme räumt man so weg.

ersetzt: ipcs, lsipc, ipcrm, ipcmk

Status: fertig (Mac)

lt loadtest fertig

Rechner gezielt belasten und dabei messen: CPU, Speicher, Platte

lt [-c ANZAHL] [-m GRÖSSE] [-d ORDNER] [-t SEK] [-q]

statt stress stress-ng memeater

mehr
-c
so viele CPU-Arbeiter (Prozesse)
-m
so viel Speicher belegen und ständig anfassen (K/M/G)
-d
in diesem Ordner auf die Platte schreiben
-t
Dauer in Sekunden (Standard 10)
-q
keine Meldungen

lt belastet den Rechner gezielt – zum Prüfen von Kühlung, Stromversorgung, tp und Planer – und misst dabei:

ersetzt: stress, memeater

Status: fertig (Mac)

nmo netmon fertig

Netzverkehr je Schnittstelle live (Empfang/Senden pro Sekunde, Summen, Fehler)

nmo [-a] [-d SEK] [-n RUNDEN] [SCHNITTSTELLE...]

statt iftop nettop bmon ifstat

mehr
-a
alle Schnittstellen (auch Loopback und ungenutzte)
-d
Takt in Sekunden (Standard 1)
-n
so viele Runden (in Pipes Standard 1)

Am Terminal wird jede Sekunde neu gezeichnet (Strg+C beendet), in Pipes eine Messung (-n für mehr). Ohne Angabe nur benutzte Schnittstellen, -a alle, oder Namen angeben (nmo en0).

ersetzt: iftop, nethogs, bmon, nettop, resmon, systat -ifstat, trafshow

Status: fertig (Mac)

18. Logs und Ereignisse

fwa filewatch fertig

Dateien und Ordner beobachten, Änderungen melden oder Befehl ausführen

fwa [-r -1 -q] [-t SEK] [-e BEFEHL] PFAD...

statt inotifywait fswatch entr inotifyd

mehr
-r
Unterordner mit beobachten
-1
nach der ersten Änderung beenden (Rückgabe 1, wenn bis -t nichts kam)
-e
bei jeder Änderung diesen Befehl ausführen (sh -c)
-t
höchstens so lange beobachten
-q
keine Ereigniszeilen

fwa PFAD… meldet Änderungen, eine Zeile je Ereignis: geändert DATEI, neu DATEI, gelöscht DATEI. -r schließt Unterordner ein. -1 beendet nach der ersten Änderung (für Skripte: fwa -1 datei && mache), -t SEK begrenzt die Zeit.

ersetzt: inotifywait, fswatch, inotifyd

Status: fertig (Mac)

lr logrotate fertig

Protokolldateien drehen: ab einer Größe umbenennen, alte bis N behalten

lr [-c -n -v] [-g GRÖSSE] [-k ANZAHL] DATEI...

statt logrotate newsyslog

mehr
-g
erst ab dieser Größe drehen (Standard 1M, 0 = immer; K/M/G)
-k
so viele alte Dateien behalten (Standard 5)
-c
kopieren und leeren statt umbenennen (für Programme, die die Datei offen halten)
-n
nur zeigen
-v
jede Datei melden

lr DATEI… dreht jede Datei, die mindestens 1 MB groß ist (-g): x.log → x.log.1 → … → x.log.5 (-k), die älteste fällt weg, eine leere x.log mit denselben Rechten wird angelegt. -c kopiert und leert stattdessen – nötig, wenn ein Dienst die Datei offen hält und weiter hineinschreibt. Für einen Zeitplan: lr regelmäßig aufrufen (Zeitplaner oder Schleife in ini).

ersetzt: logrotate, newsyslog

Status: fertig (Mac)

rec record fertig

Terminal-Sitzung aufnehmen und mit Zeitablauf abspielen

rec [-a -q] [-c BEFEHL] [DATEI] | rec -p [-s FAKTOR] [DATEI]

statt script scriptreplay

mehr
-c
nur diesen Befehl aufnehmen statt einer Shell
-a
an vorhandene Aufnahme anhängen
-q
keine Meldungen
-p
abspielen
-s
beim Abspielen so viel schneller (2 = doppelt)

rec [DATEI] startet eine Shell in einem eigenen Terminal und schreibt alles, was erscheint, nach DATEI (Standard rec.txt) und die Zeitabstände nach DATEI.zeit. exit oder Strg+D beendet. rec -c BEFEHL nimmt nur einen Befehl auf (Rückgabe = seine), -a hängt an.

ersetzt: script, scriptreplay, scriptlive

Status: fertig (Mac)

sld syslogd fertig

Protokoll-Dienst: sammelt Nachrichten in einer Datei mit Rotation; -m schreibt eine Nachricht

sld [-a SOCKET] [-o DATEI] [-g GRÖSSE] [-k ANZAHL] | sld -m [-a SOCKET] [-p NAME] [-e] TEXT...

statt syslogd rsyslogd syslog-ng logd logger

mehr
-a
Socket (Standard /run/log.sock)
-o
Protokolldatei (Standard /var/log/system.log)
-g
ab dieser Größe drehen (Standard 1M; K/M erlaubt, 0 = nie)
-k
so viele alte Dateien behalten (Standard 3)
-m
eine Nachricht an den laufenden sld schicken (wie logger)
-p
Absendername bei -m
-e
als Fehler markieren (log -e findet sie)

sld läuft als Dienst (in der Liste von ini: protokoll immer /bin/sld), nimmt Nachrichten an und schreibt sie mit Zeitstempel in /var/log/system.log:

ersetzt: rsyslogd, syslog-ng, syslogd, logd, klogd, wecutil

Status: fertig (Mac)

20. Paketverwaltung und Softwareinstallation

asc assoc fertig

Dateiendungen mit Programmen verknüpfen und Dateien damit öffnen

asc set ENDUNG PROGRAMM | get ENDUNG | rm ENDUNG | list | open DATEI

statt assoc ftype xdg-mime duti

mehr

asc set ENDUNG PROGRAMM, get, rm, list; asc open DATEI startet das verknüpfte Programm mit der Datei als Argument. Tabelle $NULLOS_ETC/assoc (ENDUNG:PROGRAMM, ohne Punkt). Ersetzt assoc/ftype (Windows), xdg-mime, duti. Nur die letzte Endung zählt (a.tar.gz → gz). Keine MIME-Typen/Inhaltserkennung (dafür ql).

ersetzt: lsregister, xdg-mime, duti, assoc, ftype

Status: fertig (Mac)

ftr features fertig

optionale Funktionen auflisten, an- und ausschalten

ftr list | on NAME | off NAME | state NAME | add NAME BESCHREIBUNG

statt dism optionalfeatures

mehr

ftr add NAME BESCHREIBUNG legt eine optionale Systemfunktion an (normalerweise legen Pakete sie an), on/off/state/list. Tabelle $NULLOS_ETC/features (NAME:an|aus:BESCHREIBUNG); Dienste und Startskripte lesen sie. Ersetzt dism /Online /Enable-Feature, optionalfeatures.

ersetzt: dism, optionalfeatures, servermanagercmd

Status: fertig (Mac)

lpm langpkg fertig

Pakete einer Programmiersprache (Paketname SPRACHE-NAME) über pk verwalten

lpm SPRACHE install|remove|info NAME | lpm SPRACHE list|search

statt pip npm cargo gem luarocks

mehr

nullos hat keine eigene Paketwelt je Sprache: ein Lua-Baustein lpeg ist das normale Paket lua-lpeg (gebaut mit pkb/prt). lpm lua install lpeg ruft deshalb pk install lua-lpeg auf, remove/info ebenso; lpm lua list und lpm lua search zeigen die installierten bzw. verfügbaren Pakete mit dem Vorsatz lua- abgeschnitten. pk kommt aus PATH oder NULLOS_PK. Fehlt: Abhängigkeitsauflösung zwischen Sprachpaketen jenseits von pk, Herunterladen von Fremdquellen (pip/npm/cargo-Netze bleiben draußen). Ersetzt pip, npm, cargo, gem nur als Namenszuordnung.

ersetzt: pip, npm, cargo, pip3

Status: fertig (Mac)

pk package fertig

Pakete (.npk) installieren, entfernen, prüfen, aus einer Paketquelle holen

pk install DATEI.npk|NAME... [-f] | remove NAME [-f] | list | avail | info NAME | files NAME | owner PFAD | verify [NAME] | pack ORDNER DATEI.npk

statt apt dnf pacman apk dpkg rpm opkg pkgutil winget pkg

mehr
-f
erzwingen (ältere Fassung, fremde Dateien, gebrauchtes Paket entfernen)

Paketformat .npk (binärsicher, ohne Zusatzwerkzeuge): NPK1, dann Zeilen name:/version:/desc:/depends: (Leerzeichen-getrennt), Leerzeile, dann Einträge D MODUS PFAD, F MODUS BYTES PFAD + Daten + \n, L ZIEL<TAB>PFAD, am Ende E. Pfade sind relativ zur Wurzel; absolute Pfade und .. werden abgelehnt. Datenbank: WURZEL/var/lib/pk/NAME/{info,files}; files hat SHA-256 und Modus je Datei. Wurzel $NULLOS_ROOT (leer = /; auf nullos fest), Paketquelle $NULLOS_REPO (Standard WURZEL/var/cache/pk, Ordner mit .npk). Versionsvergleich nach Zahlenabschnitten (1.10 > 1.9). Aktualisieren entfernt Dateien, die in der neuen Fassung fehlen; fremde Dateien im Ordner bleiben stehen. Ersetzt (teilweise) apt, dnf, pacman, apk, dpkg, rpm, pkgutil, winget. Fehlt: Netz-Paketquellen, Signaturen (gpg/crt später), Konfigurationsdateien-Schutz, Skripte vor/nach Installation.

ersetzt: apt, dnf, yum, pacman, zypper, apk, winget, pm, pkg, pkg_add, pkgin, dpkg, rpm, pkgutil, installer, msiexec, pm install, cmd package, pkg_info, snap, flatpak, mas, winget msstore

Status: fertig (Mac)

pkb pkgbuild fertig

Paket (.npk) aus einem Ordner bauen, Inhalt und Angaben anzeigen

pkb [-n NAME] [-v VERSION] [-d TEXT] [-r ABHÄNGIGKEITEN] [-o DATEI] ORDNER | pkb -l DATEI | pkb -i DATEI

statt dpkg-deb rpmbuild pkgbuild productbuild

mehr
-n
Paketname (sonst aus ORDNER/.PKGINFO)
-v
Version
-d
Beschreibung
-r
Abhängigkeiten, durch Leerzeichen getrennt
-o
Ausgabedatei (Standard NAME-VERSION.npk)
-l
Inhalt auflisten
-i
Angaben und Zusammenfassung

pkb ORDNER packt den Ordner zu NAME-VERSION.npk (Format und Datenbank: cmd/pk/README.md). Name, Version, Beschreibung und Abhängigkeiten stehen in ORDNER/.PKGINFO (Zeilen name:, version:, desc:, depends:) oder kommen aus den Optionen -n -v -d -r (Option geht vor Datei). .PKGINFO selbst kommt nicht ins Paket. Einträge sind nach Namen sortiert, damit gleiche Ordner gleiche Pakete ergeben. pkb -l DATEI listet den Inhalt, pkb -i DATEI die Angaben und prüft, dass das Ende da ist. Ohne Skripte vor/nach der Installation und ohne Signatur. Ersetzt (teilweise) dpkg-deb, rpmbuild, pkgbuild, productbuild, pkg create.

ersetzt: dpkg-deb, rpmbuild, pkgbuild, productbuild, pkg create

Status: fertig (Mac)

prt ports fertig

Bauanleitungen (Ports) auflisten und zu Paketen bauen oder gleich installieren

prt list | info NAME | build NAME [-o ORDNER] | install NAME

statt ports pkgsrc

mehr
-o
Ordner für das gebaute Paket (Standard .)

Ein Port ist ein Ordner $NULLOS_PORTS/NAME (Standard /usr/ports) mit PORT (name:, version:, desc:, depends:) und einem Shell-Skript build, das im Portordner mit DESTDIR (Zielordner), PORTDIR, PORT_NAME, PORT_VERSION läuft und nach $DESTDIR installiert. prt build NAME [-o ORDNER] führt es aus und packt das Ergebnis mit pkb zu NAME-VERSION.npk; prt install NAME baut und installiert mit pk; prt list, prt info NAME. Der Bauordner wird immer entfernt (auch bei Fehlern). Quellcode herunterladen/entpacken ist Sache des build-Skripts (noch kein Netz). pkb/pk werden über PATH oder NULLOS_PKB/NULLOS_PK gefunden. Ersetzt ports, pkgsrc (nur Bauen, keine Abhängigkeitsauflösung beim Bauen).

ersetzt: ports, pkgsrc

Status: fertig (Mac)

rsv regsvr fertig

Programmbausteine (Komponenten) unter einem Namen anmelden, abmelden, auflisten

rsv add NAME PFAD | rm NAME | get NAME | list | check

statt regsvr32

mehr

rsv add NAME PFAD meldet eine Programmdatei als Baustein (Plugin, Treiber, Bibliothek) unter einem Namen an; get, list, rm, und check prüft, ob alle angemeldeten Dateien noch da sind. Tabelle: $NULLOS_ETC/components (Zeilen NAME:PFAD). Ersetzt regsvr32/rundll32 im Sinne der Anmeldung (es gibt keine Registrierungsdatenbank und kein automatisches Laden; das Auslesen der Tabelle ist Sache des jeweiligen Programms).

ersetzt: regsvr32, rundll32

Status: fertig (Mac)

stv setver fertig

festlegen, welche Betriebssystemversion ein Programm vorgegaukelt bekommt

stv set PROGRAMM VERSION | get PROGRAMM | rm PROGRAMM | list

statt setver

mehr

stv set PROGRAMM VERSION merkt sich, welche Systemversion (z. B. 3.31) ein altes Programm gemeldet bekommen soll; get, rm, list. Tabelle $NULLOS_ETC/setver (PROGRAMM:VERSION, nur der Dateiname zählt). Die Auskunft an das Programm selbst gibt später der Programmstarter/Kernel (Wunsch: lib/ liest die Tabelle). Ersetzt SETVER.

ersetzt: setver, compatibility, SETVER

Status: fertig (Mac)

21. Sicherheit und Kryptografie

av antivirus teilweise

Dateien gegen eine Signaturliste (Prüfsummen und Bytefolgen) prüfen

av scan [-q] [-v] PFAD... | add-hash NAME DATEI | add-bytes NAME HEX | rm NAME | list

statt clamscan MpCmdRun

mehr
-q
nur Funde melden, sonst still
-v
auch saubere Dateien nennen

av scan PFAD... durchsucht Dateien und Ordner (rekursiv) nach Einträgen der Signaturliste $NULLOS_ETC/av.sig (NAME:sha256:HEX = ganze Datei, NAME:bytes:HEX = Bytefolge von 4 bis 64 Byte irgendwo in der Datei, auch über Blockgrenzen). add-hash NAME DATEI und add-bytes NAME HEX tragen Signaturen ein, rm, list. Rückgabe 0 sauber, 1 Fund, 2 nur Lesefehler. Getestet mit der genormten EICAR-Testzeichenkette. Grenzen: reine Signaturen – keine Entpackung von Archiven, keine Verhaltenserkennung, keine Muster mit Platzhaltern; eine Signaturdatenbank liefert nullos nicht mit (Aufgabe von Paketquelle und Aktualisierung). Ersetzt clamscan, MpCmdRun nur im Kern.

ersetzt: clamscan, XProtect, MpCmdRun, MSAV, VSAFE

Status: teilweise

crt certs teilweise

Zertifikatsspeicher: PEM-Zertifikate ansehen, vertrauen, entfernen, als Bündel ausgeben

crt list | bundle | add DATEI.pem... | rm FINGERABDRUCK | show DATEI | fp DATEI | verify DATEI

statt update-ca-certificates trust certutil certmgr

mehr

Das Lesen von X.509 (DER-Aufbau, Namen, Zeiten) ist selbst geschrieben und gegen openssl geprüft (Fingerabdrücke, Seriennummer, Namen, Daten zweier Zertifikate, RSA und EC). Nicht enthalten: Prüfung der Unterschrift, Zertifikatsketten, Sperrlisten – dafür braucht es geprüfte Kryptobibliotheken (Mbed TLS laut docs/research/bausteine.md). verify heißt hier also „dieses genaue Zertifikat ist vertraut und nicht abgelaufen“, nicht „von einer Wurzel beglaubigt“. Auf dem Mac gilt NULLOS_NOW (Testuhr) – auf nullos nicht. Ersetzt update-ca-certificates, trust, certutil, security (teilweise).

ersetzt: update-ca-certificates, trust, security, certutil, certreq, certmgr.msc, certctl

Status: teilweise

gk gatekeeper fertig

Dateien als „aus dem Netz, ungeprüft“ markieren; markierte Dateien nicht starten

gk mark DATEI | clear DATEI | check DATEI | run DATEI [ARG...] | list

statt spctl

mehr

gk mark DATEI markiert eine Datei als aus dem Netz geladen und ungeprüft; gk check DATEI meldet das (Rückgabe 1 = markiert); gk run DATEI … startet nur Dateien ohne Marke; gk clear DATEI hebt die Marke auf, gk list. Tabelle $NULLOS_ETC/quarantine (absoluter Pfad:1). Die Marke hängt am Pfad (nullos-Dateisysteme haben noch keine erweiterten Attribute); eine umbenannte Datei verliert sie. Der Download-Client soll gk mark aufrufen. Ersetzt spctl / xattr -d com.apple.quarantine sinngemäß.

ersetzt: spctl, xattr -d com.apple.quarantine

Status: fertig (Mac)

pol policy fertig

Richtlinien als Schlüssel/Wert-Tabelle setzen, lesen, prüfen

pol set SCHLÜSSEL WERT | get SCHLÜSSEL | unset SCHLÜSSEL | check SCHLÜSSEL WERT | list [VORSATZ]

statt profiles gpresult secedit

mehr

pol set SCHLÜSSEL WERT, get, unset, list [VORSATZ] und pol check SCHLÜSSEL WERT (Rückgabe 0, wenn der Wert so gesetzt ist – für Skripte, die eine Richtlinie prüfen). Tabelle $NULLOS_ETC/policy (SCHLÜSSEL:WERT). Es gibt keine feste Liste gültiger Schlüssel; die Programme, die eine Richtlinie beachten, lesen die Tabelle (Namen wie passwort.mindestlaenge). Ersetzt profiles, gpresult, secedit im Sinne einer einfachen zentralen Einstellungsliste. Nicht enthalten: Gruppenrichtlinien-Verteilung über das Netz.

ersetzt: profiles, secedit, gpupdate, gpresult

Status: fertig (Mac)

prv privacy fertig

festlegen, welches Programm auf welche geschützte Ressource zugreifen darf

prv grant PROGRAMM RESSOURCE | revoke PROGRAMM RESSOURCE | check PROGRAMM RESSOURCE | reset PROGRAMM | list

statt tccutil

mehr

prv grant|revoke PROGRAMM RESSOURCE erlaubt oder verbietet einem Programm den Zugriff auf eine Ressource (mikrofon, kamera, bildschirm, ordner, …); prv check … gibt Rückgabe 0 nur bei ausdrücklicher Erlaubnis; reset PROGRAMM, list. Tabelle $NULLOS_ETC/privacy (PROGRAMM@RESSOURCE:erlaubt|verboten). Die Durchsetzung liegt später bei Kernel/Gerätetreibern, die prv check oder die Tabelle abfragen. Ersetzt tccutil.

ersetzt: tccutil

Status: fertig (Mac)

ssl crypto fertig

Prüfsummen, Passwort-Verschlüsselung, Base64, Zufall, PBKDF2

ssl dgst [-md5|-sha1|-sha256|-sha512] [DATEI...] | hmac SCHLÜSSEL [DATEI] | base64 [-d] [DATEI] | hex [-d] | rand [-hex] N | pbkdf2 ... | aesctr KEY IV | enc [-e|-d] -pass TEXT [EIN [AUS]]

statt openssl certutil-hashfile sha256sum md5sum sha1sum sha512sum shasum

mehr
-sha256
Verfahren (Standard); auch -md5 -sha1 -sha512
-d
zurückwandeln (base64, hex) bzw. entschlüsseln (enc)
-pass
Passwort (oder -passenv VARIABLE)

Alles Standardverfahren, nichts Eigenes: MD5 (RFC 1321, nur Prüfsumme!), SHA-1/-256/-512 (FIPS 180-4), HMAC (RFC 2104), PBKDF2 (RFC 8018), AES (FIPS 197), CTR (SP 800-38A), Base64 (RFC 4648). test.sh prüft gegen die amtlichen Vektoren (inkl. 1-Million-„a“ und NIST-CTR-Blöcke mit Zählerübertrag).

ersetzt: openssl, certutil

Status: fertig (Mac)

22. Terminal und Konsole

bnr banner teilweise

Text in großen Buchstaben ausgeben

bnr [-w BREITE] [-c ZEICHEN] TEXT...

statt banner grdc figlet

mehr
-w
Zeilenbreite zum Umbrechen (Standard 80)
-c
Zeichen, aus dem die Buchstaben gebaut werden (Standard #)

bnr Hallo schreibt den Text in 7 Zeilen hohen Buchstaben (5×7-Raster, aus #), -c '*' wählt ein anderes Zeichen, -w 40 die Zeilenbreite für den Umbruch. Buchstaben (klein = groß), Ziffern und . , ! ? - : + = / * _ #; Umlaute erscheinen als Grundbuchstabe (Ä → A, ß → S), Unbekanntes als ?.

ersetzt: grdc, banner, morse, figlet

Status: teilweise

cb clipboard fertig

Zwischenablage: kopieren und einfügen

cb [-a] [DATEI...] | cb -o | cb -c

statt pbcopy pbpaste xclip xsel wl-copy wl-paste clip

mehr
-o
Inhalt der Zwischenablage ausgeben (einfügen)
-a
anhängen statt ersetzen
-c
Zwischenablage leeren

cb kopiert: ls | cb, cb datei1 datei2, cb -a hängt an; cb -o fügt ein (gibt aus); cb -c leert. Ohne Argumente und ohne Eingabe-Pipe (Eingabe ist das Terminal) fügt cb ebenfalls ein. Die Ablage ist eine private Datei (nur der Besitzer; Verweise und offene Rechte werden abgelehnt) (~/.clipboard, Rechte 0600, anders per CB_FILE) — Binärdaten bleiben erhalten.

ersetzt: xclip, xsel, wl-copy, pbcopy, clip, xclip -o, wl-paste, pbpaste

Status: fertig (Mac)

cns setconsole teilweise

Systemkonsole anzeigen oder auf ein anderes Gerät umschalten

cns [GERÄT]

statt setconsole conscontrol

mehr

cns zeigt die Systemkonsole (/dev/console), auf die Kernel- und Startmeldungen gehen. cns /dev/ttyS0 soll sie auf ein anderes Gerät (z. B. serielle Schnittstelle) umlenken.

ersetzt: setconsole, conscontrol, CTTY

Status: teilweise

cs clear fertig

Bildschirm löschen

cs [-x -n]

statt clear cls

mehr
-x
Rückblick (Scrollback) behalten
-n
nur die aktuelle Zeile leeren

cs löscht den Bildschirm samt Rückblick (ANSI ESC[H ESC[2J ESC[3J), -x behält den Rückblick, -n leert nur die Zeile. Braucht keine Terminal-Datenbank: nullos-Terminals sprechen ANSI.

ersetzt: clear, cls, CLS

Status: fertig (Mac)

dco dircolors fertig

Farbeinstellung für die Dateiliste (LS_COLORS) erzeugen

dco [-b | -c] [-p] [DATEI]

statt dircolors

mehr
-b
Ausgabe für sh/Bash (Standard)
-c
Ausgabe für csh
-p
die eingebaute Standardtabelle ausgeben

eval "$(dco)" setzt LS_COLORS auf die eingebauten Farben (Ordner blau, Programme grün, Archive rot, Bilder violett …). dco meine.farben liest eine eigene Tabelle im üblichen Format (DIR 01;34, EXEC 01;32, .txt 00;32, *.md 04; # Kommentar; TERM/COLOR werden überlesen), -c gibt csh-Syntax aus, -p die Standardtabelle zum Abwandeln (dco -p > ~/.farben).

ersetzt: dircolors

Status: fertig (Mac)

mx multiplex teilweise

Terminal-Sitzungen im Hintergrund halten, abhängen und wieder anhängen

mx new [-d] NAME [BEFEHL...] | mx a NAME | mx ls | mx send [-l] NAME TEXT... | mx cap NAME | mx kill NAME

statt tmux screen

mehr

mx new -d arbeit startet eine Shell (oder mx new -d bau make -j4) in einer Sitzung, die weiterläuft, auch wenn das Terminal geschlossen wird. mx a arbeit hängt sich an (Rückblick wird wiederhergestellt), Strg-B dann d löst wieder, Strg-B Strg-B sendet ein Strg-B. mx ls zeigt Sitzungen, mx send arbeit make tippt Text samt Enter hinein (-l ohne Enter), mx cap arbeit gibt den Rückblick (letzte 64 KB) aus, mx kill arbeit beendet. Sitzungen enden, wenn ihr Programm endet. Verbindung über Sockets in /tmp/mx ($MX_DIR), nur für den Besitzer.

ersetzt: tmux, screen

Status: teilweise

ntf notify teilweise

Benachrichtigung auf dem Terminal anzeigen und protokollieren

ntf [-t TITEL] [-u low|normal|critical] [-q] TEXT...

statt notify-send msg

mehr
-t
Titel (Standard „Hinweis“)
-u
Dringlichkeit (low: ohne Klingelzeichen)
-q
ohne Klingelzeichen

ntf Sicherung fertig schreibt [**] Hinweis: Sicherung fertig mit Klingelzeichen auf das Terminal (/dev/tty, per NTF_TTY änderbar) und hängt die Meldung an das Protokoll /var/log/notify (NTF_LOG) an. -t TITEL, -u critical ([!!] statt [**]), -u low oder -q ohne Klingelzeichen.

ersetzt: notify-send, osascript -e 'display notification', msg, cmd notification

Status: teilweise

rst reset fertig

Terminal nach Abstürzen wieder in Ordnung bringen

rst

statt reset

mehr

rst bringt ein verstelltes Terminal in Ordnung (nach cat einer Binärdatei, abgestürztem Editor): stellt Echo, Zeilenmodus, Signale und Zeilenende zurück (sty sane), schickt Reset ESC c, Zeichensatz, Farben, Cursor an, alternativen Bildschirm, Maus und eingeklammertes Einfügen aus und löscht den Bildschirm.

ersetzt: reset

Status: fertig (Mac)

sty termset fertig

Terminal-Einstellungen zeigen und ändern

sty [-d GERÄT] [echo|-echo] [line|-line] [sig|-sig] [crlf|-crlf] [raw|sane] [size [ZEILEN SPALTEN]]

statt stty resize setterm

mehr
-d
anderes Terminal als die Standardeingabe

sty zeigt die vier Schalter (echo, line, sig, crlf – dieselben wie TTY_ECHO/LINE/SIG/CRLF im nullos-Kernel) und die Größe. sty -echo schaltet Echo aus, sty echo an; raw = -echo -line -sig; sane/cooked stellt den Grundzustand her. sty size zeigt „Zeilen Spalten“, sty size 30 100 setzt sie (soweit das Terminal es erlaubt). -d GERÄT wirkt auf ein anderes Terminal.

ersetzt: stty, mode con, resize, ttysize, mode con cols= lines=, resizewin, setterm, vidcontrol

Status: fertig (Mac)

ti terminfo fertig

Terminal-Fähigkeiten abfragen und Steuerzeichen ausgeben

ti FÄHIGKEIT [ARG...]

statt tput tset infocmp tabs

mehr

ti FÄHIGKEIT gibt die Steuerfolge aus oder fragt eine Zahl ab, wie tput: ti cols, ti lines, ti colors, ti clear, ti bold, ti sgr0, ti setaf 1, ti setab 4, ti cup ZEILE SPALTE (ab 0), ti civis/cnorm, ti smcup/rmcup, ti el, ti tabs 4 (Tabulatoren alle 4 Spalten) u. a. Spaltenzahl/Zeilenzahl kommen vom Terminal (Stdout, Stderr, Stdin), sonst aus COLUMNS/LINES, sonst 80×24. Unbekannte Fähigkeit: Rückgabe 1.

ersetzt: tput, tset, infocmp, tic, tabs

Status: fertig (Mac)

trm terminal teilweise

Terminal-Nachbildung: Programm an Pseudo-Terminal starten, Bildschirm als Text ausgeben

trm [-r ZEILEN] [-c SPALTEN] [-w MS] [-i TASTEN]... [-f] BEFEHL [ARG...]

statt xterm gnome-terminal konsole Terminal conhost

mehr
-r
Zeilen (Standard 24)
-c
Spalten (Standard 80)
-i
Tasten senden (\n \r \t \e \cX \xHH), mehrfach möglich
-w
Ruhepause in ms, nach der das Programm als „fertig“ gilt (Standard 200)
-f
alle Zeilen ausgeben, auch leere am Ende

trm BEFEHL… startet den Befehl an einem Pseudo-Terminal (24×80, mit -r/-c änderbar), wertet dessen Ausgabe wie ein Terminal aus (Cursor setzen und bewegen, Löschen, Einfügen, Scrollbereich, UTF-8, Zeilenumbruch, Farben und Titel werden überlesen) und gibt am Ende den Bildschirminhalt als Text aus. -i 'echo hi\n' tippt Tasten (\n \r \t \e \cC \x1b), jede Eingabe wird nach einer Ruhepause (-w) gesendet. So lassen sich Vollbild-Programme wie der Editor e oder mx automatisch prüfen: trm -i 'text' -i '\cX' e datei.

ersetzt: xterm, gnome-terminal, konsole, Terminal.app, Terminal, conhost

Status: teilweise

tty ttyname fertig

Name des Terminals zeigen

tty [-s]

statt tty

mehr
-s
still: nur Rückgabewert (0 = Terminal, 1 = keins)

tty gibt den Namen des Terminals der Standardeingabe aus (/dev/ttys003), sonst „kein Terminal“ und Rückgabe 1. -s gibt nichts aus, nur der Rückgabewert zählt (für Skripte: tty -s && …).

ersetzt: tty

Status: fertig (Mac)

23. Multimedia

ac audiorecord teilweise

Ton aufnehmen und als WAV-Datei schreiben

ac [-q -v] [-r RATE] [-c KANÄLE] [-b BITS] [-t SEK] [-d GERÄT] [-i QUELLE | -s HZ] DATEI

statt arecord parecord pw-record tinycap

mehr
-r
Abtastrate in Hz (Standard 44100)
-c
Kanäle 1 bis 8 (Standard 1)
-b
Bits je Wert: 8, 16, 24, 32 (Standard 16)
-t
Aufnahmedauer in Sekunden (Standard: bis Ende der Quelle)
-d
Aufnahmegerät
-i
rohe PCM-Daten (little endian) aus Datei oder - (Eingabe) statt Gerät
-s
Testton mit dieser Frequenz erzeugen (1 s, mit -t länger)
-q
still
-v
Zusammenfassung auch bei Ausgabe nach -

ac -t 5 aufnahme.wav nimmt 5 Sekunden auf (16 Bit, 44100 Hz, mono). -r Rate, -c Kanäle, -b Bits (8/16/24/32), -d Gerät. Ohne -t läuft die Aufnahme bis zum Ende der Quelle. Als Datei - geht die Ausgabe nach stdout (Größen im Kopf bleiben dann „unbekannt“, wie bei arecord).

ersetzt: arecord, parecord, pw-record, tinycap

Status: teilweise

ap play teilweise

Tonaufnahmen (WAV) abspielen oder in eine Datei umrechnen

ap [-q -v -n -i] [-o DATEI] [-r HZ] [-c KANAELE] [-g PROZENT] DATEI.wav...

statt aplay paplay afplay tinyplay pw-play

mehr
-o
statt auf das Audiogerät in DATEI schreiben (WAV; "-" = rohe 16-Bit-Daten auf stdout)
-r
Zielabtastrate in Hz (umrechnen)
-c
Zielkanäle 1 oder 2
-g
Lautstärke in Prozent (Standard 100)
-i
nur Angaben zur Datei zeigen
-n
Probelauf: alles verarbeiten, nichts ausgeben
-v
Umrechnung und Frameanzahl zeigen
-q
still

ap lied.wav spielt eine WAV-Datei auf dem Audiogerät ab. Ersetzt aplay, paplay, afplay, tinyplay.

ersetzt: aplay, paplay, pw-play, afplay, wmplayer, tinyplay, speaker-test, mix, spkrtest

Status: teilweise

brn burn fertig

ISO-9660-Abbild (Joliet, El Torito UEFI/BIOS) erzeugen, auflisten, brennen

brn [-v -n] [-V NAME] [-e EFI] [-b BIOS] [-t SEKUNDEN] -o ABBILD ORDNER

statt mkisofs wodim cdrecord growisofs

mehr
-o
Ausgabe-Abbild (.iso)
-V
Datenträgername (bis 32 Zeichen, Standard NULLOS)
-e
Boot-Abbild für UEFI (Datei im Ordner, z. B. EFI/efiboot.img)
-b
Boot-Datei für BIOS ohne Emulation (Datei im Ordner)
-t
feste Zeit (Sekunden seit 1970) für gleiche Ausgabe
-l
Inhalt eines Abbilds auflisten
-w
Abbild auf Gerät brennen
-v
jede Datei anzeigen
-n
Probelauf, nichts schreiben

ISO-9660-Abbilder schreiben, auflisten und brennen. Ersetzt mkisofs, wodim/cdrecord, growisofs, drutil burn.

ersetzt: wodim, growisofs, drutil, hdiutil burn, isoburn, cdrecord, burncd

Status: fertig (Mac)

bsp bootsplash fertig

Startbild aus Beschreibungsdatei in einen Bildpuffer zeichnen

bsp [-n -v] DATEI AUSGABE.ppm [PROZENT]

statt fbsplash plymouth

mehr
-n
nur Datei prüfen, nichts schreiben
-v
Größe und Zahl der Zeichenbefehle zeigen

bsp [-n -v] DATEI AUSGABE.ppm [PROZENT] liest eine Splash-Beschreibung und zeichnet sie in einen 32-Bit-Bildpuffer (XRGB, bis 1024x768). Heute schreibt der Test den Puffer als PPM; auf nullos geht derselbe Puffer später in den Framebuffer des Kernels. -n prüft nur die Datei, -v nennt Größe und Anzahl der Befehle. Ersetzt fbsplash, plymouth.

ersetzt: fbsplash, plymouth

Status: fertig (Mac)

ff mediaconvert teilweise

WAV-Töne umwandeln (Abtastrate, Kanäle, Bittiefe) und Angaben zeigen

ff [-r RATE] [-c KANÄLE] [-b 8|16|24] EIN.wav AUS.wav | ff -i EIN.wav

statt sox soxi afconvert afinfo ffmpeg

mehr
-r
neue Abtastrate (Hz)
-c
Kanalzahl (Mono mittelt, Mono→Stereo kopiert)
-b
Bittiefe der Ausgabe
-i
Angaben zeigen

ff EIN.wav AUS.wav [-r RATE] [-c KANÄLE] [-b 8|16|24] wandelt Abtastrate (lineare Interpolation), Kanalzahl (auf Mono mitteln, Mono auf mehr Kanäle kopieren) und Bittiefe; ff -i EIN.wav zeigt die Angaben. Intern 16 Bit. Abgeschnittene Dateien werden so weit gelesen wie sie reichen. Nicht enthalten: MP3/FLAC/Ogg/AAC (eigene Dekodierer, später), Filter, Schnitt, Bild/Film (ffmpeg). Ersetzt sox, soxi, afconvert, afinfo im Kleinen.

ersetzt: sox, soxi, afinfo, afconvert, ffmpeg, screenrecord

Status: teilweise

imc imgconvert fertig

Bilder zwischen PNG, BMP, PPM/PGM und TGA umwandeln, skalieren, spiegeln, grau

imc [-g] [-v] [-m] [-s BREITExHÖHE] EIN AUS | imc -i EIN | imc -p X,Y EIN

statt convert sips

mehr
-s
Größe ändern (Breite allein behält das Seitenverhältnis)
-g
in Graustufen
-v
senkrecht spiegeln
-m
waagerecht spiegeln
-i
Größe anzeigen
-p
Farbwert eines Punktes (X,Y)

Lesen: PNG (alle Filter, Farbarten Grau/RGB/Palette/Grau+Alpha/RGBA, 1–16 Bit, ohne Interlacing; Alpha wird verworfen), BMP (1/4/8/24/32 Bit, unkomprimiert), PNM P1–P6, TGA (unkomprimiert). Schreiben: PNG (unkomprimiert in Deflate-„stored“-Blöcken – gültig, aber groß), BMP 24 Bit, PPM, PGM, TGA. Der Inflate-Teil folgt dem bekannten Aufbau von zlibs puff.c; geprüft mit PNGs aus Pythons zlib (dynamische Huffman-Blöcke, alle fünf Zeilenfilter) und gegenseitig mit sips des Mac (liest alle von imc geschriebenen Formate). JPEG/GIF/WebP fehlen (Lesen wäre eigener Dekodierer). Skalieren: Flächenmittel beim Verkleinern, nächster Nachbar beim Vergrößern. Der Baustein bib_img.h (Kopie in iv, scr) gehört später in lib/. Ersetzt convert, sips.

ersetzt: convert, sips

Status: fertig (Mac)

iv imageview teilweise

Bild im Terminal anzeigen (halbe Blockzeichen, 24-Bit-Farbe)

iv [-w SPALTEN] [-a] BILD...

statt eog feh

mehr
-w
Breite in Spalten (Standard $COLUMNS oder 80)
-a
ohne Farbcodes, nur Helligkeitszeichen

iv BILD... zeigt PNG/BMP/PNM/TGA im Terminal: je Terminalzeile zwei Bildzeilen mit dem Zeichen „▀“ und 24-Bit-Farbcodes (ESC[38;2;R;G;Bm / ESC[48;2;…). Größere Bilder werden auf -w SPALTEN (Standard $COLUMNS, sonst 80) verkleinert; -a gibt nur Helligkeitszeichen aus (@ = hell … Leerzeichen = dunkel), für Terminals ohne Farbe. Lesen übernimmt bib_img.h (siehe imc). Ersetzt (im Text) eog, feh, Vorschau.

ersetzt: eog, feh, Vorschau, Fotos, Galerie

Status: teilweise

mid midi fertig

MIDI-Datei lesen: Spuren, Ereignisse, Noten, Dauer

mid [-s] DATEI.mid

statt mididump aconnect

mehr
-s
nur eine Zeile Zusammenfassung

mid DATEI.mid zeigt Kopf (Format, Spuren, Teilung) und je Spur die Ereignisse mit Ticks: Noten an/aus (mit Namen wie C4), Programm- und Reglerwechsel, Tonhöhenrad, Tempo, Takt, Tonart, Texte, System-Exklusiv; am Ende die Dauer unter Berücksichtigung aller Tempowechsel (spurübergreifend). -s nur eine Zusammenfassungszeile. Unterstützt Running Status; SMPTE-Zeitteilung und Dateien über 64 KB werden abgelehnt. Ersetzt mididump; aconnect (Geräte verbinden) fehlt.

ersetzt: aconnect, mididump

Status: fertig (Mac)

mp mediaplayer teilweise

Medien abspielen/anzeigen: Ton mit ap, Bilder mit iv, MIDI-Angaben, sonst Vorschau

mp [-r WIEDERHOLUNGEN] [-l LISTE] DATEI...

statt vlc mpv

mehr
-l
Liste (eine Datei je Zeile, # = Kommentar)
-r
Wiederholungen (1 bis 100)

mp DATEI... erkennt den Inhalt und ruft das passende Werkzeug: WAV → ap, PNG/BMP/PNM → iv, MIDI → mid -s (Angaben), alles andere → ql (Vorschau). -l LISTE spielt eine Liste (eine Datei je Zeile), -r N wiederholt. Rückgabe 1, wenn eine Datei nicht lief – die übrigen werden trotzdem abgearbeitet. Die Hilfswerkzeuge kommen aus PATH oder $NULLOS_BIN. Keine Oberfläche, kein Vor/Zurück/Pause (später). Ersetzt vlc/mpv/QuickTime im Kleinen.

ersetzt: vlc, mpv, QuickTime Player, Media Player

Status: teilweise

mxr mixer teilweise

Lautstärke je Kanal (master, pcm, mic) zeigen und ändern, stumm schalten

mxr | get KANAL | set KANAL 0..100|+N|-N | mute|unmute|toggle KANAL

statt amixer alsamixer pactl wpctl

mehr

mxr zeigt master, pcm und mic; mxr set KANAL 0..100 (oder +N/-N relativ), mute/unmute/toggle, get. Zustand in $NULLOS_ETC/mixer (KANAL:LAUTSTÄRKE:an|stumm), den der Audiotreiber lesen soll (Wunsch). Die Lautstärke des Mac wird nicht angefasst. Ersetzt amixer, alsamixer, pactl, wpctl, tinymix im Kern (ohne Aufnahmequellen/Schalter).

ersetzt: amixer, alsamixer, pactl, wpctl, osascript set volume, tinymix, mixer

Status: teilweise

ql quicklook fertig

Dateityp erkennen und Wichtiges zeigen (Bildgröße, Tondauer, erste Zeilen)

ql [-n ZEILEN] DATEI...

statt qlmanage file

mehr
-n
Zeilen Textvorschau (Standard 5, 0 = keine)

ql DATEI... erkennt den Typ am Inhalt (nicht an der Endung) und zeigt Typ, Größe und Wichtiges: Bildgröße (PNG, BMP, GIF, JPEG, PNM), Kanäle/Abtastrate/Dauer (WAV), Spuren (MIDI), ELF-Art, Pakete (.npk), Archive (ZIP, gzip, bzip2, xz, tar), PDF; bei Text Kodierung (UTF-8 oder andere), Zeilenzahl und die ersten -n Zeilen (Standard 5). Erkennung nach festen Merkmalen am Dateianfang, keine Datenbank wie libmagic. Ersetzt file/qlmanage -p (Text) und die Dateiansicht von xdg-open.

ersetzt: xdg-open, qlmanage

Status: fertig (Mac)

say speak teilweise

Text vorlesen oder als WAV-Datei sprechen

say [-o DATEI.wav] [-r WÖRTER_PRO_MINUTE] [-n] TEXT...

statt espeak spd-say

mehr
-o
statt zu sprechen in eine WAV-Datei schreiben
-r
Sprechtempo
-n
nur zeigen, was gesprochen würde

say TEXT... liest vor, say -o DATEI.wav TEXT schreibt eine WAV-Datei (22050 Hz, 16 Bit), -r Tempo, -n nur anzeigen; ohne Text liest say von stdin. Die Sprachausgabe steckt in plat_host.c (ruft /usr/bin/say); plat_nullos.c meldet „nicht verfügbar“, bis eine eigene Sprachsynthese (Formant-/Diphon-Synthese als Paket, später) vorhanden ist. Ersetzt say, espeak, spd-say.

ersetzt: espeak, spd-say, say

Status: teilweise

scr screenshot teilweise

Bildspeicher (Framebuffer) als Bilddatei sichern

scr [-f GERÄT] -w BREITE -h HÖHE [-b FORMAT] [-p ZEILENBYTES] DATEI

statt screencapture grim scrot screencap

mehr
-f
Bildspeicher-Gerät oder -Datei (Standard /dev/fb0)
-b
Pixelformat: bgra rgba bgrx rgbx bgr rgb rgb565 (Standard bgra)
-p
Bytes je Zeile, falls größer als Breite mal Pixelgröße

scr -w BREITE -h HÖHE DATEI.png liest den Bildspeicher (Standard /dev/fb0, mit -f auch eine Rohdatei) und schreibt PNG/BMP/PPM/TGA. Pixelformate bgra rgba bgrx rgbx bgr rgb rgb565, -p für Zeilenlänge mit Auffüllung. Breite, Höhe und Format kennt das Programm nicht selbst – bis der Kernel eine Auskunft liefert (Wunsch: docs/syscalls.md Framebuffer-Info), muss man sie angeben. Es gibt keinen Teilbereich, kein Fenster, keine Zeitverzögerung und keine Aufnahme als Film. Ersetzt screencapture, grim, scrot, screencap im Kern.

ersetzt: grim, scrot, gnome-screenshot, screencapture, snippingtool, screencap, wf-recorder, screencapture -v, screenrecord, Bildschirmfoto, Snipping Tool

Status: teilweise

24. Drucken

asa asa fertig

Fortran-Vorschubzeichen (erste Spalte) in Text mit Leerzeilen, Seitenvorschub und Überdruck umsetzen

asa [DATEI...]
mehr

Die erste Spalte jeder Zeile steuert den Vorschub (ASA/Fortran): Leerzeichen = nächste Zeile, 0 = eine Leerzeile davor, - = zwei Leerzeilen davor, 1 = neue Seite (Seitenvorschub \f), + = überdrucken (\r statt Zeilenwechsel). Alles andere gilt wie Leerzeichen. Die erste Spalte selbst verschwindet. Dateien aus Argumenten oder stdin. Ersetzt asa.

ersetzt: asa

Status: fertig (Mac)

lp lineprint fertig

Dateien zum Drucken einreihen, Warteschlange zeigen, Aufträge abbrechen

lp [-d DRUCKER] [-n KOPIEN] [-t TITEL] [DATEI...] | lp -q [-d DRUCKER] | lp -c AUFTRAG

statt lpr lpq lpstat cancel lprm print

mehr
-d
Drucker (Standard: Standarddrucker aus lpa)
-n
Kopien (1 bis 99)
-t
Titel in der Warteschlange
-q
Warteschlange zeigen
-c
Auftrag abbrechen (Nummer wie laser-7)

lp [-d DRUCKER] [-n KOPIEN] [-t TITEL] [DATEI...] kopiert die Dateien (ohne Datei: stdin) in die Warteschlange $NULLOS_VAR/spool/lp/DRUCKER/ und nennt die Auftragsnummer (laser-7). lp -q [-d DRUCKER] zeigt die Warteschlange (Benutzer, Größe, Kopien, Titel), lp -c laser-7 bricht ab. Der Drucker kommt aus lpa (Standard oder -d). Ausgegeben werden Aufträge von lpd. Dateiformat: Aufträge sind NNNNNN.data + NNNNNN.meta (vier Zeilen: Benutzer, Titel, Kopien, Sekunden); die laufende Nummer steht in .seq. Ersetzt lp, lpr, lpq, lpstat, cancel, lprm, print.

ersetzt: lp, lpr, print, lpq, lpstat, prnjobs, cancel, lprm, prnjobs -x

Status: fertig (Mac)

lpa lpadmin fertig

Drucker anlegen, entfernen, auflisten, Standarddrucker festlegen

lpa add NAME GERÄT [text|raw] | rm NAME | list | default NAME | show NAME

statt lpadmin cupsctl prnmngr

mehr

lpa add NAME GERÄT [text|raw] richtet einen Drucker ein (GERÄT = absoluter Pfad, z. B. /dev/lp0 oder eine Datei als „virtueller Drucker“; Filter text bricht Seiten um, raw gibt unverändert aus), rm, list, show NAME, default NAME. Der erste Drucker wird Standard. Tabelle $NULLOS_ETC/printers (NAME:GERÄT:FILTER:standard|-). lp stellt Aufträge in die Warteschlange, lpd gibt sie aus. Keine Netzwerkdrucker, keine Treiber/PPD – es gibt Text und Rohdaten. Ersetzt lpadmin, prnmngr, cupsctl im Kern.

ersetzt: lpadmin, lpc, cupsctl, prnmngr, prncnfg, prndrvr, prnport, prnqctl, rundll32 printui

Status: fertig (Mac)

lpd printd fertig

Druckdienst: Warteschlangen abarbeiten und an die Geräte ausgeben

lpd [-1] [-p DRUCKER]

statt cupsd

mehr
-1
einmal durchlaufen und beenden (sonst alle 2 Sekunden von vorn)
-p
nur diesen Drucker bedienen

lpd arbeitet die Warteschlangen von lp ab ($NULLOS_VAR/spool/lp/DRUCKER/): je Auftrag der Reihe nach, so oft wie Kopien verlangt, über den Filter des Druckers (text: Seiten wie lpf, raw: unverändert) an das Gerät aus lpa angehängt; danach wird der Auftrag gelöscht. -1 einmal durchlaufen (Tests, Cron), sonst alle 2 Sekunden neu; -p DRUCKER nur einen. Lässt sich ein Gerät nicht öffnen, bleibt der Auftrag liegen und der Drucker wird in diesem Durchlauf nicht weiter bedient (Reihenfolge bleibt). Keine Netzwerkprotokolle (IPP/LPD über TCP). Ersetzt cupsd/lpd im Kern.

ersetzt: cupsd, lpd

Status: fertig (Mac)

lpf printfilter fertig

Text für den Drucker aufbereiten: Tabs, Umbruch, Seiten mit Kopfzeile

lpf [-l ZEILEN] [-w SPALTEN] [-t TITEL] [DATEI...]

statt cupsfilter pr

mehr
-l
Zeilen je Seite (Standard 60, mit Kopfzeile eingeschlossen)
-w
Spalten je Zeile (Standard 80)
-t
Titel in der Kopfzeile jeder Seite

lpf [-l ZEILEN] [-w SPALTEN] [-t TITEL] [DATEI...] bereitet Text für Drucker auf: Tabs auf 8er-Stopps, Zeilen über SPALTEN umbrechen (UTF-8-Zeichen zählen als eine Spalte), jede Seite mit ZEILEN Zeilen (Kopfzeile TITEL Seite N mitgezählt) und einem Seitenvorschub \f am Ende; CR und Steuerzeichen werden entfernt, ein \f im Text beginnt eine neue Seite. lpd benutzt dieselbe Filterfunktion für Drucker mit Filter text. Kein PostScript/PDF/Bild (Rohdaten gehen mit Filter raw unverändert durch). Ersetzt cupsfilter (Textteil) und pr.

ersetzt: cupsfilter

Status: fertig (Mac)

25. Rechnen, Einheiten, Sonstiges

clc calculator fertig

Taschenrechner im Vollbild: Verlauf, Programmierer-Modus (hex/bin), Einheiten umrechnen

clc [-p -l] [-b BITS] [-s STELLEN] [AUSDRUCK...]

statt calc gnome-calculator kcalc Rechner

mehr
-p
Programmierer-Modus (64-Bit-Ganzzahlen, & | ^ ~ << >>, Ausgabe dezimal/hex/oktal/binär)
-l
Zeilenmodus erzwingen (kein Vollbild)
-b
Wortbreite im Programmierer-Modus: 8, 16, 32 oder 64
-s
Nachkommastellen bei Division und Funktionen (Standard 20)

Ersetzt gnome-calculator, kcalc, den Windows-Rechner und calc.

ersetzt: gnome-calculator, kcalc, Rechner, calc

Status: fertig (Mac)

fct factor fertig

Zahlen in Primfaktoren zerlegen, Primzahlen auflisten

fct [-h] [ZAHL...] | fct -p [VON] BIS

statt factor primes

mehr
-h
Potenzen schreiben (2^3 statt 2 2 2)
-p
Primzahlen im Bereich ausgeben

fct 360 → 360: 2 2 2 3 3 5, fct -h 360 → 360: 2^3 3^2 5. Ohne Argumente liest fct Zahlen zeilenweise von der Eingabe. fct -p 100 oder fct -p 90 100 gibt Primzahlen aus. Funktioniert bis 2⁶⁴−1 (Probedivision für kleine Primzahlen, dann Miller-Rabin und Pollard-Rho, ohne 128-Bit-Typen).

ersetzt: factor, primes

Status: fertig (Mac)

fo fortune fertig

Zufälligen Spruch ausgeben

fo [-f DATEI] [-a] [-n NR]

statt fortune

mehr
-f
eigene Sammlung (Einträge durch Zeilen mit nur % getrennt)
-a
alle Sprüche mit Nummer ausgeben
-n
den Spruch mit dieser Nummer ausgeben

fo gibt einen zufälligen Spruch aus 30 eingebauten aus. fo -a zeigt alle mit Nummer, fo -n 7 einen bestimmten, fo -f sammlung.txt nimmt eine eigene Sammlung (Einträge durch Zeilen aus nur % getrennt, das übliche fortune-Textformat; mehrzeilige Einträge gehen). Die Zufallszahl kommt aus Uhrzeit und Prozessnummer.

ersetzt: fortune

Status: fertig (Mac)

mrs morse fertig

Text in Morsezeichen umwandeln und zurück; Caesar-Verschiebung

mrs [-d] [TEXT...] | mrs -c N [TEXT...]

statt morse caesar

mehr
-d
Morsezeichen in Text zurückwandeln
-c
Caesar: Buchstaben um N Stellen verschieben (13 = ROT13, Zurück mit 26-N)

mrs sos → ... --- ..., Wörter werden mit / getrennt. mrs -d '... --- ...' übersetzt zurück (unbekannte Zeichen werden ?). Buchstaben (auch ä ö ü ß), Ziffern und die üblichen Satzzeichen. mrs -c 13 Text verschiebt Buchstaben um 13 Stellen (Caesar/ROT13), -c -3 zurück. Ohne Text wird zeilenweise von der Eingabe gelesen.

ersetzt: morse, caesar

Status: fertig (Mac)

nw numwords fertig

Zahl in Worten schreiben (deutsch, englisch)

nw [-e] [ZAHL...]

statt number

mehr
-e
englisch statt deutsch

nw 1234567 → eine Million zweihundertvierunddreißigtausendfünfhundertsiebenundsechzig, nw -e 342 → three hundred forty-two. Ohne Argumente zeilenweise von der Eingabe. Ganze Zahlen bis 2⁶⁴−1, negativ mit „minus“. Deutsch nach den Regeln der Schreibung: Zahlen unter einer Million in einem Wort (einundzwanzigtausend), Millionen und höher getrennt (zwei Millionen, eine Milliarde; Billion = 10¹²).

ersetzt: number

Status: fertig (Mac)

pom moonphase fertig

Mondphase für heute oder ein Datum

pom [-n] [JJJJ-MM-TT [HH:MM]]

statt pom

mehr
-n
auch nächsten Neumond und Vollmond zeigen

pom zeigt die Mondphase jetzt, pom 2026-12-25 für ein Datum (12:00 UTC), pom 2026-12-25 03:00 für eine Uhrzeit. Ausgabe: 2026-10-28 12:00 UTC: abnehmender Mond, 66 % beleuchtet, Alter 17.3 Tage. -n zeigt zusätzlich den nächsten Neumond und Vollmond. Rechnung mit dem mittleren Mondmonat (29,5306 Tage) ab dem Neumond vom 6. Januar 2000: Näherung, die tatsächlichen Zeitpunkte weichen bis etwa 14 Stunden ab; für Phasennamen und Prozent reicht das, nicht für Mondfinsternisse. Eigene Kosinusreihe, keine Mathe-Bibliothek nötig.

ersetzt: pom

Status: fertig (Mac)

un units teilweise

Einheiten umrechnen

un ZAHL EINHEIT [NACH] | un -l

statt units

mehr
-l
alle bekannten Einheiten auflisten

un 5 km mi → 5 km = 3.10685596 mi, auch zusammengeschrieben un 5km mi. un 100 C F rechnet Temperaturen (C, F, K). Nur Quelle (un 1 km) zeigt alle Einheiten der Größe. un -l listet alles: Länge, Masse, Volumen, Zeit, Temperatur, Geschwindigkeit, Fläche, Daten (KB = 1000, KiB = 1024), Druck, Energie, Leistung, Winkel. Groß-/Kleinschreibung zählt nur bei Daten (B/bit, MB/MiB). Deutsche Namen: zoll, fuss, meile, pfund, sm (Seemeile). Unpassende Größen (km nach kg) werden mit Hinweis abgelehnt.

ersetzt: units

Status: teilweise

26. Virtualisierung und Container (Grundwerkzeuge)

cg cgroup teilweise

Ressourcengruppen (CPU/Speicher/IO/Prozesse) prüfen, zeigen, anwenden

cg [-n -v -q] check|show|run DATEI [GRUPPE [BEFEHL...]]

statt systemd-run cgcreate rctl

mehr
-n
Probelauf: nur zeigen, was gesetzt würde
-v
ausführlich (bei check alle Gruppen listen)
-q
still (nur Rückgabewert)

Ersetzt systemd-run, cgcreate, rctl. Optionen: -n Probelauf, -v ausführlich, -q still.

ersetzt: systemd-run, cgcreate, rctl

Status: teilweise

ctr container teilweise

Befehle in einem eigenen Wurzelordner mit eigener Umgebung starten

ctr list | create NAME WURZELORDNER [SCHLÜSSEL=WERT...] | show NAME | rm NAME | run [-s] NAME BEFEHL [ARG...]

statt docker podman runc jail jexec

mehr
-s
streng: ohne echten Einschluss (chroot) nicht starten

ctr create NAME WURZELORDNER [SCHLÜSSEL=WERT...] legt einen Container an (Datei $NULLOS_ETC/containers/NAME), ctr run [-s] NAME BEFEHL... startet den Befehl mit leerer Umgebung (nur PATH, HOME=/root, TERM, NULLOS_CONTAINER und die angegebenen Werte) in der Wurzel. Als Verwalter wird per chroot wirklich eingeschlossen; sonst nur der Arbeitsordner gewechselt und eine Warnung ausgegeben – mit -s bricht ctr dann ab. list, show, rm. Fehlt (Kernel-Sache): eigene Prozess-/Netz-/Benutzer-Namensräume, Ressourcengrenzen (siehe cg), Abbild-Schichten und Registry. plat_nullos.c ist Platzhalter, bis docs/syscalls.md chroot liefert. Ersetzt docker/podman/runc/jail nur im Kern „Programm in anderer Wurzel“.

ersetzt: docker, podman, runc, systemd-nspawn, container, jail, jexec, jls

Status: teilweise

vm virtualmachine fertig

virtuelle Maschinen beschreiben und mit QEMU starten

vm list | create NAME [-m MB -c CPUS -a ARCH -d PLATTE -e STARTORDNER -f FIRMWARE -n none|user -w none|window] | show|cmd|run|rm NAME | disk DATEI GRÖSSE

statt qemu virsh bhyve vmctl

mehr
-m
Arbeitsspeicher in MB
-c
Prozessoren
-a
x86_64 oder aarch64
-d
Plattenabbild
-e
Ordner als FAT-Startpartition
-f
UEFI-Firmware (pflash)
-n
Netz: none oder user
-w
Anzeige: none oder window

Eine Maschine ist eine Datei $NULLOS_ETC/vm/NAME.conf (arch= mem= cpus= disk= esp= firmware= net= display= serial=). vm create NAME [-m MB -c CPUS -a x86_64|aarch64 -d PLATTE -e STARTORDNER -f FIRMWARE -n none|user -w none|window], vm list, vm show NAME, vm cmd NAME (zeigt die QEMU-Befehlszeile), vm run NAME (startet sie, Rückgabewert von QEMU wird durchgereicht; Plattenabbild und Startordner müssen vorhanden sein), vm rm NAME, vm disk DATEI 4G (leeres Plattenabbild, sparse). Die Befehlszeile entspricht dem Makefile-Ziel make run (q35 + UEFI-Firmware als pflash + FAT-Ordner). $NULLOS_QEMU ersetzt das QEMU-Programm (Tests). Ein Hypervisor von nullos selbst (KVM-artig) ist nicht gemeint; virsh-Funktionen wie Schnappschüsse, Netze, Speicherpools fehlen. Ersetzt qemu-system-*-Aufrufe von Hand, virsh, bhyve im Kleinen.

ersetzt: qemu-system-*, virsh, hv, vmcompute, bhyve, bhyvectl, vmctl

Status: fertig (Mac)

27. GUI-Grundanwendungen (später)

cfe configeditor fertig

Einstellungen als Baum ansehen und ändern (Textmodus)

cfe [-r] [DATEI]

statt dconf-editor regedit

mehr
-r
nur lesen

cfe [-r] [DATEI] zeigt Einstellungen als Baum aus Ordnern und Schlüsseln und ändert sie mit wenigen Tasten. Ersetzt dconf-editor und regedit. Textmodus; die Terminalbausteine (term.c, term.h) sind aus cmd/e kopiert.

ersetzt: dconf-editor, regedit

Status: fertig (Mac)

chm charmap fertig

Zeichentabelle: Unicode-Blöcke, Namenssuche, Codes

chm [-l -s -v] [BLOCK [SEITE] | U+CODE | ZEICHEN | WORT...]

statt gucharmap charmap

mehr
-l
alle Blöcke auflisten
-s
nach Zeichennamen suchen (alle Wörter müssen passen)
-v
Block als Liste mit Namen statt als Tabelle

chm (lang charmap, ersetzt gucharmap, Zeichenübersicht, charmap) zeigt Unicode als Text.

ersetzt: gucharmap, Zeichenübersicht, charmap

Status: fertig (Mac)

clk clock fertig

Uhr: Weltzeit, Stoppuhr, Timer, Wecker

clk [-n -q] [world ZONE... | zones MUSTER | stopwatch | timer DAUER [TEXT] | alarm UHRZEIT [ZONE] | conv UHRZEIT VONZONE [NACHZONE...]]

statt uhr

mehr
-n
nur zeigen (Timer: Dauer, Wecker: Zeitpunkt), nicht warten
-q
still (kein Herunterzählen)

Ersatz für gnome-clocks, als Textwerkzeug. Zeiten sind UTC-genau; ohne Zonendatei, nur eigene kompakte Tabelle.

ersetzt: gnome-clocks, Uhr, Kalender

Status: fertig (Mac)

dsk disks teilweise

Datenträger ansehen: Partitionstabelle (MBR/GPT) und Dateisystem je Partition

dsk ABBILD_ODER_GERÄT

statt gnome-disks gparted diskmgmt.msc diskutil-list

mehr

dsk ABBILD (Datei oder Gerät) zeigt die Partitionstabelle (MBR mit aktiv-Markierung, GPT mit 512 oder 4096-Byte-Sektoren, Typ, Größe, Name) und erkennt je Partition das Dateisystem an den Merkmalen im ersten Bereich: FAT12/16/32, exFAT, NTFS, ext2/3/4 (aus den Merkmalsbits), HFS+, APFS, SquashFS, ISO 9660, Swap – mit Namen (Label) soweit vorhanden. Ohne Tabelle wird der ganze Datenträger geprüft. Erweiterte MBR-Partitionen (logische Laufwerke) und Größen über 2 GB (ABI: fseek mit long) fehlen. Nur Lesen. Ersetzt gnome-disks/GParted/diskmgmt.msc/diskutil list im Lesen.

ersetzt: gnome-disks, GParted, Festplattendienstprogramm, diskmgmt.msc

Status: teilweise

evv eventviewer teilweise

Protokolle nach Stufe, Zeit und Text filtern, die letzten Zeilen oder Zahlen je Stufe zeigen

evv [-p STUFE] [-g TEXT] [-s AB-DATUM] [-u BIS-DATUM] [-n LETZTE] [-c] [DATEI...]

statt journalctl eventvwr gnome-logs

mehr
-p
mindestens diese Stufe: debug info warn error crit
-g
nur Zeilen mit diesem Text
-s
ab diesem Zeitpunkt (Anfang von JJJJ-MM-TT HH:MM:SS)
-u
bis zu diesem Zeitpunkt
-n
nur die letzten N Treffer
-c
nur zählen je Stufe

evv [DATEI...] liest Protokolle (ohne Datei alle $NULLOS_VAR/log/*.log, sortiert nach Dateiname; - = stdin) im Zeilenformat JJJJ-MM-TT HH:MM:SS STUFE Quelle: Text (Stufen debug info warn error crit, Groß-/Kleinschreibung egal) und filtert: -p STUFE (mindestens), -g TEXT, -s/-u Zeitraum (Anfang des Zeitstempels, z. B. "2026-10-28 09"), -n N nur die letzten N Treffer, -c zählt je Stufe. Zeilen ohne Zeitstempel (Fortsetzungen) gehören zur Stufe der vorigen Zeile. Kein Mitlesen im Dauerbetrieb (-f) und keine binären Journale. Das Prüfprotokoll mit Kette ist aud. Ersetzt journalctl/eventvwr-Filterung im Kern.

ersetzt: gnome-logs, Konsole, eventvwr

Status: teilweise

fe fileexplorer teilweise

Dateimanager als Befehlsschale: ansehen, wechseln, kopieren, verschieben, löschen

fe [ORDNER]   (Befehle von stdin, help zeigt sie)

statt mc ranger nnn fm

mehr

fe [ORDNER] liest Befehle zeilenweise von stdin (am Terminal mit Eingabeaufforderung ORDNER> ): ls/la (Art, Größe, Name), cd, pwd, tree (3 Ebenen), view/head (Datei zeigen), info, cp, mv, rm (Dateien; Ordner nur leer), mkdir, help, quit. Wörter mit Leerzeichen in "Anführungszeichen". Nichts wird überschrieben (cp/mv verweigern bestehende Ziele). Rückgabe 1, wenn irgendein Befehl scheiterte. Ohne Pfeiltasten, Fenster und Mehrfachauswahl – das braucht lib/term.h bzw. die Oberfläche (Wunsch). Ersetzt in der Befehlsform mc/ranger/nnn; für die Fenster-Dateimanager (Nautilus, Finder, Explorer) gibt es noch kein Gegenstück (fm ausgelassen).

ersetzt: mc, ranger, nnn

Status: teilweise

fm filemanager teilweise

Ordnerinhalt als Übersicht: Ordner zuerst, Größen (auch mit Unterordnern), Sortierung, Summe

fm [-a] [-r] [-S|-T] [-R] [ORDNER]

statt Finder Explorer Nautilus Dolphin Thunar

mehr
-a
versteckte Dateien zeigen
-r
Ordnergrößen aus allen Unterordnern berechnen
-S
nach Größe sortieren (größte zuerst)
-T
nach Zeit sortieren (neueste zuerst)
-R
Reihenfolge umkehren

fm [ORDNER] listet den Inhalt: zuerst Ordner ([Ordner]), dann Dateien ([Link] für Verknüpfungen), je Zeile Größe in B/K/M/G, Änderungszeit und Name; am Ende die Summe. -a versteckte Dateien, -r rechnet Ordnergrößen und Dateizahlen aus allen Unterordnern, -S sortiert nach Größe (größte zuerst), -T nach Zeit (neueste zuerst), -R kehrt um; Ordner bleiben immer oben. Zählt wie du die Dateigrößen, nicht die belegten Blöcke. Nur Ansicht – Kopieren/Verschieben/Löschen macht fe (oder c, m, d). Ersetzt Finder / Explorer / Nautilus als Liste.

ersetzt: Nautilus, Dolphin, Thunar, Finder, Explorer, Dateien

Status: teilweise

mmc adminconsole teilweise

Verwaltungswerkzeuge in einer Übersicht und unter einem Namen aufrufen

mmc [list] | mmc MODUL [ARGUMENTE...] | mmc -i

statt compmgmt.msc services.msc

mehr
-i
Befehle zeilenweise von stdin

mmc (oder mmc list) zeigt die Verwaltungsmodule mit dem zuständigen Werkzeug (benutzer→usr, gruppen→grp, passwort→psw, pakete→pk, drucker→lpa, ereignisse→evv, richtlinien→pol …, 22 Einträge). mmc MODUL ARG... startet das Werkzeug mit den Argumenten (Rückgabewert wird durchgereicht); mmc -i liest Zeilen MODUL ARG... von stdin (quit beendet). Werkzeuge kommen aus PATH oder $NULLOS_BIN. Die Modulliste ist fest im Programm; Dienste (services.msc) fehlen, bis es eine Dienstverwaltung gibt (anderes Werkzeug). Ersetzt mmc/compmgmt.msc als Verteiler.

ersetzt: mmc, compmgmt.msc, services.msc

Status: teilweise

pnt paint teilweise

Bilder per Befehlsskript zeichnen (Linien, Rechtecke, Kreise, Füllen) und speichern

pnt [SKRIPT]   (new b h [farbe] | color … | pixel x y | line … | rect … | circle … | fill x y | save datei)

statt Paint

mehr

pnt [SKRIPT] liest Befehle zeilenweise (Datei oder stdin): new BREITE HÖHE [FARBE], color NAME|#RRGGBB|R G B, pixel X Y, line X0 Y0 X1 Y1, rect X Y B H [fill], circle X Y R [fill], fill X Y (Eimer: zusammenhängende Fläche gleicher Farbe), save DATEI (.png .bmp .ppm .tga). Farbnamen: schwarz weiss rot gruen blau gelb orange grau braun lila tuerkis rosa. # beginnt einen Kommentar. Zeichnen außerhalb des Bildes wird abgeschnitten. Rückgabe 1, wenn ein Befehl scheiterte (die übrigen laufen weiter). Bilder liest/schreibt bib_img.h (siehe imc). Ohne Text, Verläufe, Auswahl, Rückgängig. Ersetzt Paint im Skriptbetrieb.

ersetzt: Paint

Status: teilweise

sto store teilweise

Programme der Paketquelle suchen, ansehen, installieren und entfernen

sto list | search TEXT | installed | info NAME | install NAME | remove NAME

statt appstore

mehr

sto list zeigt die Pakete der Paketquelle (pk avail), sto search TEXT filtert Name und Beschreibung (Rückgabe 1 ohne Treffer), sto installed (pk list), sto info|install|remove NAME reichen an pk weiter (Rückgabewert von pk wird durchgereicht). pk kommt aus PATH oder $NULLOS_PK. Keine Bewertungen, Bilder, Kategorien oder Bezahlung; was in der Paketquelle liegt, bestimmt NULLOS_REPO (siehe pk). Ersetzt GNOME Software / App Store / Microsoft Store im Textmodus.

ersetzt: GNOME Software, App Store, Microsoft Store, Play Store

Status: teilweise

sts settings teilweise

persönliche Einstellungen (Anzeige, Ton, Sprache, Zeit, Tastatur) lesen und prüfend ändern

sts list | get SCHLÜSSEL | set SCHLÜSSEL WERT | reset SCHLÜSSEL

statt defaults control gnome-control-center

mehr

sts list zeigt alle bekannten Einstellungen mit aktuellem Wert (oder „(Vorgabe)“), sts get SCHLÜSSEL, sts set SCHLÜSSEL WERT (mit Prüfung: Zahlenbereich, Auswahlliste oder Text; bei falschem Wert Rückgabe 2 und nichts geschrieben), sts reset SCHLÜSSEL. Bekannte Schlüssel: anzeige.helligkeit, anzeige.skalierung, ton.lautstaerke, ton.signale, sprache, zeit.zone, zeit.format, tastatur.belegung, tastatur.wiederholung, erscheinung.farbschema, energie.bildschirm_aus, datenschutz.abmelden_sperre. Datei: $HOME/.config/nullos-settings (SCHLÜSSEL=WERT, auf dem Mac auch $NULLOS_SETTINGS). Die Einstellungen sind nur Werte: das Anwenden (Helligkeit wirklich ändern usw.) macht je Programm/Treiber, der sie liest. Für Systemrichtlinien siehe pol, für den Lautstärkezustand mxr. Ersetzt defaults, die Einstellungen der Oberflächen im Textmodus.

ersetzt: gnome-control-center, Systemeinstellungen, Einstellungen, control

Status: teilweise

28. Windows-/DOS-spezifische Befehle ohne direktes Unix-Gegenstück

bas basic fertig

BASIC-Interpreter (Zeilennummern optional)

bas [-e CODE] [DATEI [ARGUMENT...]]

statt qbasic gwbasic

mehr
-e
CODE direkt ausführen statt einer Datei

bas DATEI [ARGUMENT...] führt ein BASIC-Programm aus, bas -e 'PRINT 1+1' direkt einen Text, bas ohne Angabe öffnet die Eingabeaufforderung (NEW LIST RUN LOAD "f" SAVE "f" BYE, Zeilen mit Nummer werden gespeichert, alles andere sofort ausgeführt). Ersetzt QBASIC und GW-BASIC. Rückgabewert 1 bei Fehler (mit Zeilennummer), SYSTEM n setzt ihn.

ersetzt: QBASIC, GW-BASIC

Status: fertig (Mac)

dvf driververify fertig

Treiber und Systemdateien gegen eine SHA-256-Liste prüfen

dvf make DATEI... > LISTE | dvf check LISTE [BASISORDNER]

statt verifier sfc sha256sum-c

mehr

dvf make DATEI... > LISTE schreibt je Datei SHA256␣␣Pfad (dasselbe Format wie sha256sum), dvf check LISTE [BASISORDNER] prüft alle Einträge und nennt FEHLT / VERÄNDERT; Rückgabe 1 bei Abweichungen. Gedacht für die Treiber- und Systemdateien, die der Bootloader/Kernel vor dem Laden vergleichen soll (Wunsch: Kernel nutzt dieselbe Liste). Nur Prüfsummen, keine Unterschriften – wer die Liste ändern kann, kann alles ändern; sie muss selbst geschützt oder signiert sein (Signaturen brauchen eine geprüfte Kryptobibliothek). Ersetzt verifier/sfc im Sinne der Dateiprüfung, nicht der Laufzeitprüfung von Treibern.

ersetzt: verifier

Status: fertig (Mac)

lh loadhigh fertig

Befehl ausführen (Kompatibilität für DOS-Anleitungen mit LOADHIGH/LOADFIX)

lh [-q] BEFEHL [ARG...]

statt loadhigh loadfix

mehr
-q
Hinweis unterdrücken

lh BEFEHL ... führt den Befehl einfach aus. DOS-Anleitungen schreiben LH programm oder LOADFIX programm, um Speicherbereiche zu beeinflussen; nullos hat flachen Speicher, also bleibt nur der Befehlsaufruf (mit einem Hinweis, -q unterdrückt ihn). Rückgabewert = der des Befehls, 127 wenn nicht startbar.

ersetzt: LOADHIGH, LH, LOADFIX

Status: fertig (Mac)

lic license fertig

Lizenztext des Systems zeigen (Name, Prüfsumme) oder festlegen

lic show | status | set DATEI

statt slmgr

mehr

lic show gibt den Lizenztext des Systems aus ($NULLOS_ETC/license), lic status den Namen (erste Zeile) und die SHA-256-Prüfsumme, lic set DATEI legt einen neuen Text fest. nullos braucht keine Aktivierung – es gibt weder Schlüssel noch Zeitablauf; lic ersetzt slmgr /dli nur als Anzeige der Lizenzbedingungen. Der Test benutzt shasum des Mac nur als Gegenprobe.

ersetzt: slmgr

Status: fertig (Mac)

vfy verify fertig

Prüfschalter lesen/setzen; zwei Dateien nach dem Kopieren vergleichen

vfy [on|off] | vfy -c QUELLE ZIEL

statt verify

mehr
-c
zwei Dateien Byte für Byte vergleichen

vfy zeigt den Prüfschalter (on/off, Datei $NULLOS_ETC/verify; Kopierwerkzeuge können ihn lesen und danach vergleichen). vfy -c QUELLE ZIEL vergleicht zwei Dateien Byte für Byte und meldet die erste Abweichung. Ersetzt DOS-VERIFY und den Vergleichsschritt nach copy /v.

ersetzt: verify, VERIFY

Status: fertig (Mac)

wds netboot fertig

Startdateien (Bootloader, Kernel) auf die Startpartition übertragen und per SHA-256 prüfen

wds [-n] [-v] QUELLE ZIEL

statt bcdboot wdsutil

mehr
-n
nur zeigen
-v
auch unveränderte Dateien nennen

wds QUELLE ZIEL kopiert ein Startpartitionsabbild (wie build/esp aus make os: EFI/BOOT/BOOTX64.EFI und der Ordner nullos/) auf eine eingehängte Startpartition ZIEL. Reihenfolge: erst nullos/ (Kernel usw.), zuletzt der Bootloader – bricht etwas ab, bleibt der alte Start unangetastet. Jede Datei geht über eine Hilfsdatei (.neu, dann rename) und wird nach dem Schreiben per SHA-256 mit der Quelle verglichen; unveränderte Dateien werden übersprungen. -n Probelauf, -v ausführlich. Kein Netzwerkstart (PXE/TFTP) und kein UEFI-Bootmenü-Eintrag (efibootmgr) – nur die Dateien. Ersetzt bcdboot sinngemäß.

ersetzt: wdsutil, bcdboot

Status: fertig (Mac)

wsa winsat fertig

Leistung messen: Prozessor (SHA-256), Speicher (Kopieren), Datenträger (Schreiben/Lesen)

wsa [cpu] [mem] [disk] | all  [-s MEGABYTE] [-d ORDNER]

statt winsat sysbench

mehr
-s
Datenmenge in MB (Standard 32)
-d
Ordner für die Datenträgermessung (Standard .)

wsa [cpu] [mem] [disk] (ohne Angabe alles) misst und nennt MB/s: cpu SHA-256 über 64-KB-Blöcke, mem memcpy zwischen zwei Puffern (Mittel aus 8 Durchläufen), disk Schreiben (mit fflush/fclose, nicht fsync – der Zwischenspeicher des Betriebssystems kann die Zahl schönen) und Lesen einer Messdatei in -d ORDNER, die danach gelöscht wird. -s MB Datenmenge (Standard 32). Es gibt keine Gesamtnote wie bei winsat; die Werte sind nur auf demselben Rechner vergleichbar.

ersetzt: winsat

Status: fertig (Mac)

wsu winsetup fertig

einen leeren Ordner/Datenträger als nullos einrichten (Verzeichnisbaum, Grunddateien, Pakete)

wsu [-h RECHNERNAME] [-p] [-f] ZIELORDNER [PAKET.npk...]

statt winnt winnt32 sysocmgr

mehr
-h
Rechnername (Standard nullos)
-p
Passwort für root als eine Zeile von stdin setzen
-f
vorhandene Grunddateien überschreiben

wsu ZIELORDNER [PAKET.npk...] richtet einen vorhandenen leeren Ordner (oder eine eingehängte Partition) als nullos-Wurzel ein: Verzeichnisbaum (bin dev etc home root tmp usr/{bin,lib,share} var/{lib/pk,log,run,cache/pk,spool} mnt, /tmp mit Sticky-Bit, /root 0700), Grunddateien etc/passwd, group, shadow (root gesperrt), hostname, shells, issue – vorhandene bleiben unberührt, -f überschreibt – und installiert die angegebenen Pakete mit pk (NULLOS_ROOT). -p setzt das root-Passwort über psw -s (eine Zeile von stdin), -h den Rechnernamen. Das Partitionieren/Formatieren (part, mk) und das Übertragen der Startdateien (wds) sind eigene Werkzeuge; eine Auswahl der Pakete und Sprachen wie bei Windows-Setup gibt es nicht. Ersetzt winnt/winnt32/sysocmgr im Sinne des Einrichtens.

ersetzt: winnt, winnt32, sysocmgr

Status: fertig (Mac)

29. macOS-spezifische Werkzeuge ohne direktes Gegenstück

bom bom fertig

Dateiliste (Modus, Größe, SHA-256) eines Ordners erstellen und später vergleichen

bom make ORDNER > LISTE | bom check LISTE [ORDNER]

statt mkbom lsbom

mehr

bom make ORDNER > LISTE schreibt je Eintrag eine Zeile PFAD<TAB>ART<TAB>MODUS<TAB>GRÖSSE<TAB>SHA-256 (ART d/f/l; bei Verknüpfungen das Ziel), sortiert und damit reproduzierbar. bom check LISTE [ORDNER] vergleicht und meldet fehlt:, geändert: und neu:; Rückgabe 1 bei Abweichung. Ersetzt mkbom/lsbom (das Textformat ist unser eigenes, nicht das macOS-BOM-Binärformat; ls der Liste ist cat/g).

ersetzt: lsbom, mkbom

Status: fertig (Mac)

dcl dotclean fertig

"._Name"-Reste löschen, wenn "Name" daneben existiert

dcl [-n] [-v] [-r] ORDNER...

statt dot_clean

mehr
-n
nur zeigen
-v
jede Datei zeigen
-r
Unterordner einbeziehen

dcl ORDNER löscht Dateien ._Name, zu denen es daneben die Datei Name gibt (AppleDouble-Reste, die macOS auf fremden Datenträgern hinterlässt). Ohne Gegenstück bleibt die Datei. -r auch Unterordner, -n nur zeigen, -v jede Datei nennen. Anders als macOS dot_clean wird nichts zusammengeführt (nullos kennt keine Ressourcen-Gabeln) – die Reste werden nur entfernt.

ersetzt: dot_clean

Status: fertig (Mac)

fca fontcache fertig

Schriften in Ordnern suchen, Namen auslesen und einen Index anlegen; im Index suchen

fca [-v] [ORDNER...] | list | find TEIL_DES_NAMENS

statt fc-cache fc-list atsutil

mehr
-v
jede Schrift nennen

fca [ORDNER...] sucht rekursiv .ttf .otf .bdf .pcf .psf (Standard $NULLOS_FONTS, sonst /usr/share/fonts; mehrere Ordner mit : trennen) und schreibt $NULLOS_VAR/cache/fonts.idx (NAME<TAB>FORMAT<TAB>GRÖSSE<TAB>PFAD, sortiert; über Hilfsdatei). Der Name kommt bei TrueType/OpenType aus der Tabelle name (Familie, nameID 1), bei BDF aus FAMILY_NAME, sonst vom Dateinamen. fca list und fca find TEIL lesen den Index (Rückgabe 0, auch ohne Treffer). Keine Stile/Gewichte, keine Zeichenabdeckung, keine Schriftsammlungen (.ttc). Ersetzt fc-cache, fc-list, atsutil.

ersetzt: fc-cache, atsutil

Status: fertig (Mac)

shr share fertig

Ordner unter einem Namen freigeben (lesen oder lesen+schreiben), Freigaben auflisten

shr add NAME ORDNER [ro|rw] | rm NAME | show NAME | list

statt net-share sharing

mehr

shr add NAME ORDNER [ro|rw] gibt einen Ordner unter einem Namen frei, rm, show, list. Tabelle $NULLOS_ETC/shares (NAME:ORDNER:ro|rw). Das eigentliche Anbieten übers Netz macht ein Dateidienst (nicht Teil dieses Werkzeugs; er liest die Tabelle). Ersetzt sharing (macOS) und net share (Windows).

ersetzt: sharing, net share

Status: fertig (Mac)

sip sip fertig

Liste geschützter Pfade führen und Pfade darauf prüfen

sip status | add PFAD | rm PFAD | check PFAD | list

statt csrutil

mehr

sip add|rm PFAD pflegt die Liste geschützter Systempfade, sip check PFAD prüft, ob ein Pfad (oder ein Ordner darüber) geschützt ist (Rückgabe 1 = geschützt), status, list. Tabelle $NULLOS_ETC/protected. Nur Buchführung: die Durchsetzung muss der Kernel/das Dateisystem übernehmen; Werkzeuge wie d oder m können sip check vor dem Ändern fragen (Wunsch). Es wird nichts am Betriebssystem des Mac berührt. Ersetzt csrutil sinngemäß.

ersetzt: csrutil

Status: fertig (Mac)