Check input device is a terminal
The task is to demonstrate how to check whether the input device is a terminal or not.
See also: Check output device is a terminal
C
Use isatty()
on file descriptor to determine if it's a TTY. To get the file descriptor from a FILE*
pointer, use fileno
:
<lang c>#include <unistd.h> //for isatty()
- include <stdio.h> //for fileno()
int main(void) { puts(isatty(fileno(stdin)) ? "stdin is tty" : "stdin is not tty"); return 0; }</lang>
- Output:
$ ./a.out stdin is tty $ ./a.out < /dev/zero stdin is not tty $ echo "" | ./a.out stdin is not tty
D
<lang d>import std.stdio;
extern(C) int isatty(int);
void main() {
if (isatty(0)) writeln("Input comes from tty."); else writeln("Input doesn't come from tty.");
}</lang>
- Output:
C:\test Input comes from tty. C:\test < in.txt Input doesn't come from tty.
OCaml
<lang ocaml>let () =
print_endline ( if Unix.isatty Unix.stdin then "Input comes from tty." else "Input doesn't come from tty." )</lang>
Testing in interpreted mode:
$ ocaml unix.cma istty.ml Input comes from tty. $ echo "foo" | ocaml unix.cma istty.ml Input doesn't come from tty.
Perl
<lang perl>use strict; use warnings; use 5.010; if (-t) {
say "Input comes from tty.";
} else {
say "Input doesn't come from tty.";
}</lang>
$ perl istty.pl Input comes from tty. $ true | perl istty.pl Input doesn't come from tty.
Perl 6
<lang perl6>say $*IN.t ?? "Input comes from tty." !! "Input doesn't come from tty.";</lang>
$ perl6 istty.p6 Input comes from tty. $ true | perl6 istty.p6 Input doesn't come from tty.
Python
<lang python>from sys import stdin if stdin.isatty():
print("Input comes from tty.")
else:
print("Input doesn't come from tty.")</lang>
$ python istty.pl Input comes from tty. $ true | python istty.pl Input doesn't come from tty.
REXX
<lang rexx>/*REXX program determines if input comes from terminal or standard input*/
if queued() then say 'input comes from the terminal.'
else say 'input comes from the (stacked) terminal queue.'
/*stick a fork in it, we're done.*/
</lang>
Tcl
Tcl automatically detects whether stdin is coming from a terminal (or a socket) and sets up the channel to have the correct type. One of the configuration options of a terminal channel is -mode (used to configure baud rates on a real serial terminal) so we simply detect whether the option is present. <lang tcl>if {[catch {fconfigure stdin -mode}]} {
puts "Input doesn't come from tty."
} else {
puts "Input comes from tty."
}</lang> Demonstrating:
$ tclsh8.5 istty.tcl Input comes from tty. $ tclsh8.5 istty.tcl </dev/null Input doesn't come from tty.