Check output device is a terminal: Difference between revisions
m (moved Detect output to terminal to Detect output going to terminal: same pattern than "Detect input coming from terminal") |
(→Tcl: Added demonstration) |
||
Line 52: | Line 52: | ||
Output doesn't go to tty. |
Output doesn't go to tty. |
||
</pre> |
</pre> |
||
=={{header|Tcl}}== |
|||
To detect whether output is going to a terminal in Tcl, you check whether the <code>stdout</code> channel looks like a serial line (as those are indistinguishable from terminals). The simplest way of doing that is to see whether you can read the <tt>-mode</tt> channel option, which is only present on serial channels: |
|||
<lang tcl>set toTTY [dict exists [fconfigure stdout] -mode] |
|||
puts [expr {$toTTY ? "Output goes to tty" : "Output doesn't go to tty"}]</lang> |
|||
{{out|Demonstrating}} |
|||
Assuming that the above script is stored in the file <tt>istty.tcl</tt>: |
|||
<pre>$ tclsh8.5 istty.tcl |
|||
Output goes to tty |
|||
$ tclsh8.5 istty.tcl | cat |
|||
Output doesn't go to tty</pre> |
Revision as of 09:11, 28 March 2013
In this task, the job is to check whatever output filehandle exits to the terminal and mention whatever output goes to it or not.
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() {
puts(isatty(fileno(stdout)) ? "stdout is tty" : "stdout is not tty"); return 0;
}</lang>
- Output:
$ ./a.out stdout is tty $ ./a.out > tmp $ cat tmp stdout is not tty $ ./a.out | cat stdout is not tty
OCaml
<lang ocaml>let () =
print_endline ( if Unix.isatty Unix.stdout then "Output goes to tty." else "Output doesn't go to tty." )</lang>
Testing in interpreted mode:
$ ocaml unix.cma istty.ml Output goes to tty. $ ocaml unix.cma istty.ml > tmp $ cat tmp Output doesn't go to tty. $ ocaml unix.cma istty.ml | cat Output doesn't go to tty.
Tcl
To detect whether output is going to a terminal in Tcl, you check whether the stdout
channel looks like a serial line (as those are indistinguishable from terminals). The simplest way of doing that is to see whether you can read the -mode channel option, which is only present on serial channels:
<lang tcl>set toTTY [dict exists [fconfigure stdout] -mode]
puts [expr {$toTTY ? "Output goes to tty" : "Output doesn't go to tty"}]</lang>
- Demonstrating:
Assuming that the above script is stored in the file istty.tcl:
$ tclsh8.5 istty.tcl Output goes to tty $ tclsh8.5 istty.tcl | cat Output doesn't go to tty