Start · Sprachen · PHP · Referenz · posix_isatty

posix_isatty

Funktion

Prüft, ob ein Dateideskriptor oder eine Ressource einem interaktiven Terminal (TTY) zugeordnet ist.

seit PHP 4.0.0 Kategorie: misc

Signatur

posix_isatty(resource|int $fd): bool

Beschreibung

posix_isatty() ermittelt anhand eines Dateideskriptors oder einer Stream-Ressource, ob das zugehörige Gerät ein interaktives Terminal (TTY) ist. Die Funktion ist besonders nützlich, wenn PHP-Skripte sowohl interaktiv in der Kommandozeile als auch in automatisierten Pipelines eingesetzt werden – so kann das Skript unterschiedliche Ausgabemodi (z. B. farbige Ausgaben im Terminal, plain text in Pipes) wählen.

Als Parameter wird entweder ein Integer-Dateideskriptor (0 für STDIN, 1 für STDOUT, 2 für STDERR) oder eine PHP-Stream-Ressource (z. B. STDIN, STDOUT) akzeptiert. Die Funktion wrappet intern den POSIX-Systemaufruf isatty(3).

Sie ist nur auf Unix-ähnlichen Systemen verfügbar und erfordert die POSIX-Erweiterung. Unter Windows steht sie nicht zur Verfügung. Für CLI-Skripte, die zwischen interaktivem und nicht-interaktivem Betrieb unterscheiden müssen, ist dies die zuverlässigste Methode.

Parameter

Name Typ Default Beschreibung
$fd Pflicht resource|int Ein Dateideskriptor als Integer (z. B. 0, 1, 2) oder eine Stream-Ressource (z. B. STDIN, STDOUT, STDERR).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Dateideskriptor einem interaktiven Terminal zugeordnet ist, andernfalls false. Bei ungültigem Deskriptor wird ebenfalls false zurückgegeben.

Beispiele

Interaktives Terminal erkennen und Ausgabe anpassen

<?php
// Prüfen, ob STDOUT an ein Terminal angeschlossen ist
if (posix_isatty(STDOUT)) {
    // Farbige Ausgabe für interaktive Terminals
    echo "\033[32mErfolgreich!\033[0m\n";
} else {
    // Einfache Ausgabe für Pipes, Redirects oder Log-Dateien
    echo "Erfolgreich!\n";
}
Erfolgreich! (je nach Terminal ggf. in grüner Farbe)

STDIN auf TTY prüfen (Dateideskriptor als Integer)

<?php
// Verwendung mit Integer-Dateideskriptor
// 0 = STDIN, 1 = STDOUT, 2 = STDERR
$descriptors = [0 => 'STDIN', 1 => 'STDOUT', 2 => 'STDERR'];

foreach ($descriptors as $fd => $name) {
    $isTty = posix_isatty($fd);
    echo $name . ': ' . ($isTty ? 'ist ein TTY' : 'kein TTY') . PHP_EOL;
}
STDIN: ist ein TTY STDOUT: ist ein TTY STDERR: ist ein TTY

Einsatz in einem CLI-Skript mit Passwort-Abfrage

<?php
// Passwort nur interaktiv abfragen, nicht in einer Pipeline
if (!posix_isatty(STDIN)) {
    fwrite(STDERR, "Fehler: Passwort-Eingabe erfordert ein interaktives Terminal.\n");
    exit(1);
}

echo 'Passwort: ';
// Passwort lesen (ohne Systemtools hier nur symbolisch)
$password = trim(fgets(STDIN));
echo "Passwort wurde eingelesen.\n";
Passwort: Passwort wurde eingelesen.

// Wichtig · Fallstricke

Plattformabhängigkeit: posix_isatty() ist nur auf Unix-ähnlichen Systemen (Linux, macOS, BSD) verfügbar. Unter Windows steht die POSIX-Erweiterung standardmäßig nicht zur Verfügung.

Voraussetzung: Die PHP-POSIX-Erweiterung (ext/posix) muss installiert und aktiviert sein. Auf vielen Systemen ist sie standardmäßig dabei, kann aber durch Compile-Flags oder Paketaufteilung fehlen. Prüfe mit extension_loaded('posix').

Unterschied zu stream_isatty(): Seit PHP 7.2.0 steht die plattformübergreifende Funktion stream_isatty() zur Verfügung, die auch unter Windows funktioniert und für neuen Code bevorzugt werden sollte.