Wie kann ich überprüfen, ob ein Perl-Skript in einem terminal?
Ich bin versucht zu bestimmen, innerhalb ein Perl-Skript unter Linux, ob es läuft in einem terminal.
Ist, muss ich code:
- gibt true zurück, wenn einfach ausführen auf der Kommandozeile
- auch true zurück, wenn ausgeführt
./myscript.pl | less
oder sogar./myscript.pl </dev/null >/dev/null 2>/dev/null
- gibt false zurück, wenn die Ausführung in einem cron-job, oder als ein CGI-Skript
Besonders, weil die zweite Kugel, die ich nicht benutzen kann -t STDOUT
und Variationen, und auch IO::Interaktive ist von keinerlei nutzen.
Den Informationen nicht angezeigt werden, zur Verfügung. Wenn ich ps
ist, zeigt es einen Eintrag wie pts/2
im TTY
Spalte, auch wenn ich ./myscript.pl </dev/null >/dev/null 2>/dev/null
, und ?
bei Ausführung als cron-job oder CGI-Skript.
Gibt es einen eleganten Weg, um zu bestimmen, dieses in ein Perl-Skript? Ich möchte lieber nicht analysieren die Ausgabe von ps
.
- Ich denke, dass perl zur Verfügung hat
isatty(3)
Funktion. isatty
besteht in der POSIX-Modul, ja, aber, wie-t
, prüft, ob eine Datei-handle verbunden ist, um ein tty. Nicht das, was ich brauche...- Ist die ctermid - Funktion zur Verfügung?
ctermid
ist, existiert tatsächlich in der POSIX-Modul. Leider gibt es/dev/tty/
auf der Kommandozeile als auch in einem cron-job.- Wie wäre es mit einer alternative Methode, die nicht mit tty-Erkennung? Setzen Sie einen besonderen Umgebungsvariable in deine crontab und das script testen.
- Ich könnte das machen, ja; aber ich habe bereits mehrere Möglichkeiten, um zuverlässig tun tty-Erkennung, also ich werde mit dem stick. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, zu öffnen /dev/tty.
Dies funktioniert, wenn Sie in ein terminal (auch in einem terminal auf einem remote-computer).
Ansonsten, wenn das Skript ausgeführt wird, über at oder cron, wird es nicht.
Hinweis: dies funktioniert nur auf Unix-Systemen.
sub isatty() { no autodie; return open(my $tty, '+<', '/dev/tty'); }
isatty
gibt).sub isatty() { no autodie; state $isatty = open(my $tty, '+<', '/dev/tty'); return $isatty; }
. Ich werde mit.Andere Antwort auf meine eigene Frage. Ich studierte die
ps
Quelle, um zu sehen, wie es bestimmt die ein TTY-Gerät, und er verwendet/proc/[pid]/stat
.PS sollte Ihnen zu helfen.
ps aux | grep 'filename.pl'
Teilweise Antwort auf meine eigene Frage, die folgende funktioniert der trick:
Gibt den TTY-Namen, wenn alle (was auch stimmt), oder "" falls keine (false).
Ich würde immer noch lieber eine Lösung ohne einen externen Befehl...
Zuerst müssen Sie überprüfen, ist der Ausgang verbunden mit Klemme durch "- t". Natürlich, wenn Sie wollen, können Sie Blick in /proc/$pid/fd/1 , es ist symlink zum Gerät. Sie können es testen, wenn es ein terminal.
Aber wenn es nicht genug ist, können Sie überprüfen enviromential Variablen von %ENV spezielle hash-Tabelle. CGI-BIN-Schnittstelle stellt einige von Ihnen vor. Wenn Sie das Skript ausführen, unter cron, es setzt einige variable. Wenn es nicht reicht, können Sie es in /etc/crontab-Datei und testen Sie in Ihrem Skript. Es ist für Ihre Bedürfnisse, was Sie tun.
Sollten Sie nennen, die komplette Prozedur nur einmal. Sie kann nicht Durchlaufen, weil Skript-Umgebung nicht ändern, bis es funktioniert.
Müssen Sie nicht, rufen Sie eine externe Kommandos, oder Sie brauchen keine speziellen libarier. Nur das, was Sie brauchen, ist windows-Inkompatibilitäten. Aber, wenn Sie mit windows10, dann hat es ähnliche Umgebung auf linux basiert auf ubuntu. dann können Sie schauen aus, wie stark, wie Sie es tun, so Kompatibilität zwischen win32api-und unix-wie Systeme.