Signatur
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
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";
}
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;
}
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";
// 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.