Cosa fa#
Standard IEEE (Institute of Electrical and Electronics Engineers) che definisce un contratto comune per sistemi operativi Unix-like. Specifica il comportamento di shell, comandi, variabili speciali, chiamate di sistema e utility. Garantisce che uno script o un programma scritto su un sistema POSIX-compliant funzioni su qualsiasi altro.
TL;DR#
Analogia OOP:
POSIX (interfaccia)
│
├── bash (implementazione) → rispetta il contratto
├── zsh (implementazione) → rispetta il contratto
├── sh (implementazione) → rispetta il contratto
└── dash (implementazione) → rispetta il contratto
Come un'interfaccia in OOP: ogni implementazione e' diversa
ma tutte espongono gli stessi metodi ($0, $1, $?, grep, find...)Perche' esiste#
Negli anni '80 esistevano decine di varianti Unix incompatibili:
SunOS → le sue variabili, i suoi comandi
HP-UX → varianti diverse
AIX → ancora diverso
BSD → ancora diverso
→ uno script scritto per SunOS non girava su HP-UXPOSIX ha standardizzato il contratto comune. Linux non e' certificato POSIX ufficialmente ma e' POSIX-compatible nella pratica.
Distro grande (Ubuntu) → bash + zsh + sh + dash + ...
Distro minimale (Alpine) → solo sh (busybox)
Container scratch → solo sh o niente
Router embedded → solo sh
Ma TUTTI implementano POSIX
→ $0, $1, $?, grep, find, cat funzionano ovunqueun container Docker "scratch" da 5MB non può permettersi bash da 1MB quando sh da 50KB fa il lavoro base.
Cosa standardizza POSIX#
1. Variabili speciali della shell#
| Variabile | Contenuto |
|---|---|
$0 | Nome della shell o dello script corrente |
$1, $2... | Argomenti posizionali |
$@ | Tutti gli argomenti come lista |
$# | Numero di argomenti |
$? | Exit code dell'ultimo comando (0 = successo) |
$$ | PID della shell corrente |
$! | PID dell'ultimo processo in background |
Queste variabili funzionano identicamente in bash, zsh, sh e dash.
2. Character classes nelle regex#
POSIX definisce classi di caratteri portabili per le espressioni regolari:
:alpha: → lettere (a-z, A-Z) — indipendente dalla locale
:digit: → cifre (0-9)
:space: → spazi, tab, newline
:upper: → maiuscole
:lower: → minuscole
:alnum: → lettere e cifre
:punct: → punteggiatura
:print: → caratteri stampabili
# Perche' preferire :alpha: a [a-zA-Z]?
# [a-zA-Z] dipende dalla locale del sistema
# su un sistema con locale it_IT potrebbe includere caratteri accentati
# :alpha: e' definito dallo standard — sempre consistente3. Comandi standard#
ls, grep, find, cat, sort, uniq, cut, awk, sed — tutti definiti da POSIX con comportamento garantito.
4. Exit codes#
0 → successo
1 → errore generico
2 → uso errato del comando (argomenti sbagliati)
126 → permesso negato (file non eseguibile)
127 → comando non trovato
128+ → terminato da segnale (128 + numero segnale)POSIX vs bash-specific#
Non tutto quello che funziona in bash e' POSIX:
# POSIX — funziona ovunque
if [ "$var" = "valore" ]; then
# bash-specific — non funziona in sh o dash
if "$var" == "valore"; then
# POSIX
for i in $(seq 1 10); do
# bash-specific
for i in {1..10}; doQuando scrivi #!/bin/bash usi bash. Quando scrivi #!/bin/sh prometti che usi solo POSIX — e su molti sistemi /bin/sh e' dash, non bash.
Perche' e' importante per Blue Team#
Gli script di sistema, i cron job e gli script di init usano quasi sempre #!/bin/sh — POSIX puro. Capire la differenza tra POSIX e bash-specific aiuta a:
- Leggere script di sistema senza confusione
- Scrivere script portabili che girano su qualsiasi sistema
- Capire perche' certi script falliscono su sistemi embedded o container minimali
Dove l'ho incontrato#
- bandit-32 — variabili speciali POSIX (
$0) per escape da shell ristretta - Script bash durante lo studio —
$1,$?,$@usati regolarmente
Collegato a#
- system — categoria
- bash-startup-files — file di startup che usano sintassi POSIX
- shell-interattiva — le shell implementano lo standard POSIX
- shell-environment — variabili d'ambiente definite dallo standard


