: in der Shell ist ein Nullbefehl (null command), der nichts tut und nur seine Argumente auswertet. In Kombination mit Parameter Expansion lassen sich Pflichtargumente prüfen und Standardwerte knapp handhaben
: "${1:?missing argument, aborting!}" gibt eine Diagnosemeldung auf stderr aus und beendet sich mit einem Status ungleich 0, wenn $1 fehlt oder leer ist
- Übergibt man
${VAR:=default} als Argument an :, wird die Expansion ausgeführt, die resultierende Zeichenkette aber verworfen. So lässt sich nur ein Standardwert setzen, ohne das Expansionsergebnis als Befehl auszuführen
: kann auch zum Leeren von Dateien per Redirection, zum Prüfen der Zugreifbarkeit, als leerer Befehl in trap, zur Variablenprüfung unter set -u sowie in leeren Bedingungszweigen verwendet werden
: "${VAR:=default}" reduziert Tippfehler, weil der Variablenname nur einmal geschrieben wird; in while : ist es eine immer erfolgreiche Bedingung und drückt eine Endlosschleife aus
Nullbefehl und Parameter Expansion
: ist ein eingebauter Nullbefehl, der seine Argumente auswertet und das Ergebnis verwirft
- Er reicht bis zur Thompson shell von 1971 zurück und wurde damals auch als Label sowie als erstes Kommentarzeichen in Unix verwendet
- Statt eines vierzeiligen Konditionals kann man ein Pflichtargument mit folgender Einzeile prüfen
: "${1:?missing argument, aborting!}"
echo "Hello $1!"
- Die Syntax
${name:?diagnostic} der Parameter Expansion prüft, ob $name nicht gesetzt oder leer ist
- Fehlt der Wert, wird
diagnostic auf stderr ausgegeben und die Shell mit einem Status ungleich 0 beendet
- Ist ein Wert vorhanden, liefert sie dasselbe Ergebnis wie
$name
- Führt man
${HELLO:=123} ohne Nullbefehl aus, wird das Expansionsergebnis 123 als Befehl behandelt, was zu command not found führt
: ${HELLO:=123} wertet die Expansion aus, setzt dabei HELLO=123 und verwirft das Ergebnis
: "${DATA_DIR:=/var/data}" schreibt den Variablennamen im Gegensatz zu DATA_DIR="${DATA_DIR:-/var/data}" nur einmal und reduziert damit die Wahrscheinlichkeit von Tippfehlern wie DATA_DRI
Einsatzmöglichkeiten von :
-
Standardwerte setzen
- Setzt Standardwerte für Variablen, während das Expansionsergebnis verworfen und nicht ausgeführt wird
: "${DATA_DIR:=/var/data}"
: "${RETRIES:=3}"
-
Dateien leeren und Zugriff prüfen
- In Kombination mit Redirection lassen sich eine oder mehrere Dateien leeren
: > error.log
: > error.log > access.log
- Mit einer Subshell und Redirection kann auch geprüft werden, ob Dateien les- bzw. schreibbar sind
( : < dataset.json ) && echo YES
( : >> result.json ) && echo YES
-
Stellen, an denen ein leerer Befehl nötig ist
- Nützlich, wenn syntaktisch ein Befehl erforderlich ist, aber tatsächlich nichts passieren soll, etwa bei
trap
trap : INT
sleep 60
- Auch in einem absichtlich leeren Zweig einer Bedingung einsetzbar
if some-command; then
:
else
echo "command failed"
fi
-
Mehrere Variablen prüfen
- Prüft bei aktiviertem
set -u mehrere Variablen auf einmal darauf, ob sie gesetzt sind
set -u
: "$DEPLOY_ENV" "$HOST"
-
Endlosschleife
- Da
: immer erfolgreich ist, lässt sich eine Endlosschleife knapp schreiben
while :; do
echo "I love colons"
sleep 1
done
1 Kommentare
Lobste.rs-Kommentare
: hayalci@tassadar ~/src/dool ; jj rebase -s dxw -d mrnautocd-Option der Shell und das folgende Format~/directoryname; <command>Beim Kopieren der Shell-Befehlszeile wird dadurch jedes Mal weiter in das Verzeichnis
cdgewechselt, in dem der Befehl ursprünglich ausgeführt wurdezshist es so konfiguriert, dass beim Einfügen eines unsichtbaren geschützten Leerzeichens ohne Zeilenumbruch der linke Inhalt gelöscht wirdmakemehrereecho-Prozesse gleichzeitig starten, die in denselben Stream schreiben und sich dadurch gegenseitig stören. Wenn man es so ändert, gibt nicht ein Kindprozess, sondern dermake-Prozess selbst ausman :oderwhatis :war kaum brauchbare Dokumentation zu findenSie ist ähnlich wie der Befehl
true, reagiert aber nicht speziell auf--help,--versionusw. und hat außerdem weniger Zeichenmanmithelpnachschlagen:buchstäblich ein Alias fürtrueDaran, das für Nebeneffekte zu nutzen, die bei der Auswertung von Argumenten entstehen, hatte ich allerdings nicht gedacht
:kann man auch#voranstellen und es als Kommentar speichern. Wenn es etwas ist, das man später ausführen will, hat das den Vorteil, dass Ausdrücke darin nicht vorab ausgewertet werdenhttps://nathangrigg.com/2014/04/zsh-push-line-or-edit/
-bash: !}": event not found"!"weglässtwhile true; do...while true; doist nur drei Zeichen länger alswhile :; do, also kurz genug, und der Code wirkt nicht wie ein Beispiel, das gut zu dem Punkt passt, den der Autor vermitteln will