Check output device is a terminal: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: added syntax colouring, marked p2js incompatible)
m (syntax highlighting fixup automation)
Line 14: Line 14:
=={{header|6502 Assembly}}==
=={{header|6502 Assembly}}==
{{works with|Commodore 64}}
{{works with|Commodore 64}}
<lang 6502asm>LDA $D011 ;screen control register 1
<syntaxhighlight lang=6502asm>LDA $D011 ;screen control register 1
AND #%00100000 ;bit 5 clear = text mode, bit 5 set = gfx mode
AND #%00100000 ;bit 5 clear = text mode, bit 5 set = gfx mode
BEQ isTerminal</lang>
BEQ isTerminal</syntaxhighlight>


=={{header|Ada}}==
=={{header|Ada}}==
Line 22: Line 22:
We use the interface to C library functions <code>isatty()</code> and <code>fileno()</code>.
We use the interface to C library functions <code>isatty()</code> and <code>fileno()</code>.


<lang ada>with Ada.Text_IO; use Ada.Text_IO;
<syntaxhighlight lang=ada>with Ada.Text_IO; use Ada.Text_IO;
with Interfaces.C_Streams; use Interfaces.C_Streams;
with Interfaces.C_Streams; use Interfaces.C_Streams;


Line 32: Line 32:
Put_Line(Standard_Error, "stdout is a tty.");
Put_Line(Standard_Error, "stdout is a tty.");
end if;
end if;
end Test_tty;</lang>
end Test_tty;</syntaxhighlight>


{{out}}
{{out}}
Line 47: Line 47:
Use <code>isatty()</code> on file descriptor to determine if it's a TTY. To get the file descriptor from a <code>FILE*</code> pointer, use <code>fileno</code>:
Use <code>isatty()</code> on file descriptor to determine if it's a TTY. To get the file descriptor from a <code>FILE*</code> pointer, use <code>fileno</code>:


<lang c>#include <unistd.h> // for isatty()
<syntaxhighlight lang=c>#include <unistd.h> // for isatty()
#include <stdio.h> // for fileno()
#include <stdio.h> // for fileno()


Line 56: Line 56:
: "stdout is not tty");
: "stdout is not tty");
return 0;
return 0;
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 73: Line 73:


=={{header|C sharp|C#}}==
=={{header|C sharp|C#}}==
<lang csharp>using System;
<syntaxhighlight lang=csharp>using System;


namespace CheckTerminal {
namespace CheckTerminal {
Line 81: Line 81:
}
}
}
}
}</lang>
}</syntaxhighlight>


=={{header|C++}}==
=={{header|C++}}==
{{trans|C}}
{{trans|C}}
<lang cpp>#if _WIN32
<syntaxhighlight lang=cpp>#if _WIN32
#include <io.h>
#include <io.h>
#define ISATTY _isatty
#define ISATTY _isatty
Line 105: Line 105:


return 0;
return 0;
}</lang>
}</syntaxhighlight>


=={{header|COBOL}}==
=={{header|COBOL}}==
Works with GnuCOBOL.
Works with GnuCOBOL.


<lang cobol> *>
<syntaxhighlight lang=cobol> *>
*> istty, check id fd 0 is a tty
*> istty, check id fd 0 is a tty
*> Tectonics: cobc -xj istty.cob
*> Tectonics: cobc -xj istty.cob
Line 135: Line 135:


goback.
goback.
end program istty.</lang>
end program istty.</syntaxhighlight>


DISPLAY for fd 1 is directed to SYSERR to get some output during the various trials.
DISPLAY for fd 1 is directed to SYSERR to get some output during the various trials.
Line 160: Line 160:
=={{header|Common Lisp}}==
=={{header|Common Lisp}}==
{{Works with|SBCL}}
{{Works with|SBCL}}
<lang lisp>(with-open-stream (s *standard-output*)
<syntaxhighlight lang=lisp>(with-open-stream (s *standard-output*)
(format T "stdout is~:[ not~;~] a terminal~%"
(format T "stdout is~:[ not~;~] a terminal~%"
(interactive-stream-p s)))</lang>
(interactive-stream-p s)))</syntaxhighlight>


{{Out}}
{{Out}}
Line 176: Line 176:
We use the interface to C library functions <code>isatty()</code> and <code>fileno()</code>. It needs to be compiled to be executed.
We use the interface to C library functions <code>isatty()</code> and <code>fileno()</code>. It needs to be compiled to be executed.


<lang lisp>(ffi:clines "
<syntaxhighlight lang=lisp>(ffi:clines "
#include <sys/ioctl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <unistd.h>
Line 193: Line 193:


(format T "stdout is~:[ not~;~] a terminal~%" (tty-p))
(format T "stdout is~:[ not~;~] a terminal~%" (tty-p))
(quit)</lang>
(quit)</syntaxhighlight>


Compilation can be done with the following commands :
Compilation can be done with the following commands :
Line 208: Line 208:


=={{header|Crystal}}==
=={{header|Crystal}}==
<lang ruby>File.new("testfile").tty? #=> false
<syntaxhighlight lang=ruby>File.new("testfile").tty? #=> false
File.new("/dev/tty").tty? #=> true
File.new("/dev/tty").tty? #=> true
STDOUT.tty? #=> true</lang>
STDOUT.tty? #=> true</syntaxhighlight>


=={{header|D}}==
=={{header|D}}==
<lang D>import std.stdio;
<syntaxhighlight lang=D>import std.stdio;


extern(C) int isatty(int);
extern(C) int isatty(int);
Line 219: Line 219:
void main() {
void main() {
writeln("Stdout is tty: ", stdout.fileno.isatty == 1);
writeln("Stdout is tty: ", stdout.fileno.isatty == 1);
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 231: Line 231:
=={{header|Factor}}==
=={{header|Factor}}==
You have to know 1 is the correct file descriptor number:
You have to know 1 is the correct file descriptor number:
<lang factor>
<syntaxhighlight lang=factor>
IN: scratchpad USE: unix.ffi
IN: scratchpad USE: unix.ffi
IN: scratchpad 1 isatty
IN: scratchpad 1 isatty
Line 237: Line 237:
--- Data stack:
--- Data stack:
1
1
</syntaxhighlight>
</lang>




=={{header|FreeBASIC}}==
=={{header|FreeBASIC}}==
<lang freebasic>
<syntaxhighlight lang=freebasic>
Open Cons For Output As #1
Open Cons For Output As #1
' Open Cons abre los flujos de entrada (stdin) o salida (stdout) estándar
' Open Cons abre los flujos de entrada (stdin) o salida (stdout) estándar
Line 253: Line 253:
Close #1
Close #1
Sleep
Sleep
</syntaxhighlight>
</lang>




Line 259: Line 259:
Tells a ''terminal'' apart from a ''pipe'' on Linux and Mac, which is probably exactly what you need.
Tells a ''terminal'' apart from a ''pipe'' on Linux and Mac, which is probably exactly what you need.


<lang go>package main
<syntaxhighlight lang=go>package main


import (
import (
Line 272: Line 272:
fmt.Println("Who are you? You're not a terminal")
fmt.Println("Who are you? You're not a terminal")
}
}
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 283: Line 283:
=={{header|Haskell}}==
=={{header|Haskell}}==


<lang haskell>module Main where
<syntaxhighlight lang=haskell>module Main where


-- requires the unix package
-- requires the unix package
Line 296: Line 296:
(if istty
(if istty
then "stdout is tty"
then "stdout is tty"
else "stdout is not tty")</lang>
else "stdout is not tty")</syntaxhighlight>
{{Out}}
{{Out}}
<pre>$ runhaskell istty.hs
<pre>$ runhaskell istty.hs
Line 306: Line 306:
=={{header|J}}==
=={{header|J}}==


<lang J>3=nc<'wd'</lang>
<syntaxhighlight lang=J>3=nc<'wd'</syntaxhighlight>


Explanation:
Explanation:
Line 321: Line 321:


=={{header|Javascript/NodeJS}}==
=={{header|Javascript/NodeJS}}==
<lang js>node -p -e "Boolean(process.stdout.isTTY)"
<syntaxhighlight lang=js>node -p -e "Boolean(process.stdout.isTTY)"
true</lang>
true</syntaxhighlight>


=={{header|Julia}}==
=={{header|Julia}}==
<lang Julia>
<syntaxhighlight lang=Julia>
if isa(STDOUT, Base.TTY)
if isa(STDOUT, Base.TTY)
println("This program sees STDOUT as a TTY.")
println("This program sees STDOUT as a TTY.")
Line 331: Line 331:
println("This program does not see STDOUT as a TTY.")
println("This program does not see STDOUT as a TTY.")
end
end
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 340: Line 340:
=={{header|Kotlin}}==
=={{header|Kotlin}}==
{{Works with|Ubuntu|14.04}}
{{Works with|Ubuntu|14.04}}
<lang scala>// Kotlin Native version 0.5
<syntaxhighlight lang=scala>// Kotlin Native version 0.5


import platform.posix.*
import platform.posix.*
Line 349: Line 349:
else
else
println("stdout is not a terminal")
println("stdout is not a terminal")
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 359: Line 359:
{{works with|Lua|5.1+}}
{{works with|Lua|5.1+}}
Using pure Lua, assuming a *NIX-like runtime environment ...
Using pure Lua, assuming a *NIX-like runtime environment ...
<lang Lua>local function isTTY ( fd )
<syntaxhighlight lang=Lua>local function isTTY ( fd )
fd = tonumber( fd ) or 1
fd = tonumber( fd ) or 1
local ok, exit, signal = os.execute( string.format( "test -t %d", fd ) )
local ok, exit, signal = os.execute( string.format( "test -t %d", fd ) )
Line 367: Line 367:
print( "stdin", isTTY( 0 ) )
print( "stdin", isTTY( 0 ) )
print( "stdout", isTTY( 1 ) )
print( "stdout", isTTY( 1 ) )
print( "stderr", isTTY( 2 ) )</lang>
print( "stderr", isTTY( 2 ) )</syntaxhighlight>


{{out}}
{{out}}
Line 393: Line 393:


You can accomplish the same results using the luaposix [https://github.com/luaposix/luaposix] library:
You can accomplish the same results using the luaposix [https://github.com/luaposix/luaposix] library:
<lang lua>local unistd = require( "posix.unistd" )
<syntaxhighlight lang=lua>local unistd = require( "posix.unistd" )


local function isTTY ( fd )
local function isTTY ( fd )
Line 403: Line 403:
print( "stdin", isTTY( 0 ) )
print( "stdin", isTTY( 0 ) )
print( "stdout", isTTY( 1 ) )
print( "stdout", isTTY( 1 ) )
print( "stderr", isTTY( 2 ) )</lang>
print( "stderr", isTTY( 2 ) )</syntaxhighlight>


The output of this version is identical to the output of the first version.
The output of this version is identical to the output of the first version.
Line 409: Line 409:
=={{header|Nemerle}}==
=={{header|Nemerle}}==
There is no explicit way (ie <tt>isatty()</tt>)to do this; however, if we ''assume'' that standard out ''is'' a terminal, we can check if the output stream has been redirected (presumably to something other than a terminal).
There is no explicit way (ie <tt>isatty()</tt>)to do this; however, if we ''assume'' that standard out ''is'' a terminal, we can check if the output stream has been redirected (presumably to something other than a terminal).
<lang Nemerle>def isTerm = System.Console.IsOutputRedirected;</lang>
<syntaxhighlight lang=Nemerle>def isTerm = System.Console.IsOutputRedirected;</syntaxhighlight>


=={{header|Nim}}==
=={{header|Nim}}==
Line 415: Line 415:
As we want to redirect stdout, we write the messages on stderr.
As we want to redirect stdout, we write the messages on stderr.


<lang Nim>import terminal
<syntaxhighlight lang=Nim>import terminal


stderr.write if stdout.isatty: "stdout is a terminal\n" else: "stdout is not a terminal\n"</lang>
stderr.write if stdout.isatty: "stdout is a terminal\n" else: "stdout is not a terminal\n"</syntaxhighlight>


{{out}}
{{out}}
Line 428: Line 428:
=={{header|OCaml}}==
=={{header|OCaml}}==


<lang ocaml>let () =
<syntaxhighlight lang=ocaml>let () =
print_endline (
print_endline (
if Unix.isatty Unix.stdout
if Unix.isatty Unix.stdout
then "Output goes to tty."
then "Output goes to tty."
else "Output doesn't go to tty."
else "Output doesn't go to tty."
)</lang>
)</syntaxhighlight>


Testing in interpreted mode:
Testing in interpreted mode:
Line 449: Line 449:


=={{header|Ol}}==
=={{header|Ol}}==
<lang scheme>
<syntaxhighlight lang=scheme>
(define (isatty? fd) (syscall 16 fd 19))
(define (isatty? fd) (syscall 16 fd 19))
(print (if (isatty? stdout)
(print (if (isatty? stdout)
"stdout is a tty."
"stdout is a tty."
"stdout is not a tty."))
"stdout is not a tty."))
</syntaxhighlight>
</lang>


=={{header|Perl}}==
=={{header|Perl}}==
The -t function on a filehandle tells you whether it's a terminal.
The -t function on a filehandle tells you whether it's a terminal.


<lang bash>$ perl -e "warn -t STDOUT ? 'Terminal' : 'Other'"
<syntaxhighlight lang=bash>$ perl -e "warn -t STDOUT ? 'Terminal' : 'Other'"
Terminal
Terminal
$ perl -e "warn -t STDOUT ? 'Terminal' : 'Other'" > x.tmp
$ perl -e "warn -t STDOUT ? 'Terminal' : 'Other'" > x.tmp
Other
Other
</syntaxhighlight>
</lang>


=={{header|Phix}}==
=={{header|Phix}}==
<!--<lang Phix>(notonline)-->
<!--<syntaxhighlight lang=Phix>(notonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (no input or output redirection in a browser!)</span>
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (no input or output redirection in a browser!)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"stdin:%t, stdout:%t, stderr:%t\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">isatty</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">),</span><span style="color: #000000;">isatty</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">isatty</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"stdin:%t, stdout:%t, stderr:%t\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">isatty</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">),</span><span style="color: #000000;">isatty</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">isatty</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)})</span>
<!--</lang>-->
<!--</syntaxhighlight>-->
{{out}}
{{out}}
<pre>
<pre>
Line 486: Line 486:


=={{header|PHP}}==
=={{header|PHP}}==
<lang php>
<syntaxhighlight lang=php>
if(posix_isatty(STDOUT)) {
if(posix_isatty(STDOUT)) {
echo "The output device is a terminal".PHP_EOL;
echo "The output device is a terminal".PHP_EOL;
Line 492: Line 492:
echo "The output device is NOT a terminal".PHP_EOL;
echo "The output device is NOT a terminal".PHP_EOL;
}
}
</syntaxhighlight>
</lang>


=={{header|Python}}==
=={{header|Python}}==
Pretty much the same as [[Check input device is a terminal#Python]].
Pretty much the same as [[Check input device is a terminal#Python]].
<lang python>from sys import stdout
<syntaxhighlight lang=python>from sys import stdout
if stdout.isatty():
if stdout.isatty():
print 'The output device is a teletype. Or something like a teletype.'
print 'The output device is a teletype. Or something like a teletype.'
else:
else:
print 'The output device isn\'t like a teletype.'</lang>
print 'The output device isn\'t like a teletype.'</syntaxhighlight>


=={{header|Quackery}}==
=={{header|Quackery}}==
Line 506: Line 506:
{{trans|Python}}
{{trans|Python}}


<lang Quackery> [ $ |from sys import stdout
<syntaxhighlight lang=Quackery> [ $ |from sys import stdout
to_stack( 1 if stdout.isatty() else 0)|
to_stack( 1 if stdout.isatty() else 0)|
python ] is ttyout ( --> b )
python ] is ttyout ( --> b )
Line 513: Line 513:
[ say "Looks like a teletype." ]
[ say "Looks like a teletype." ]
else
else
[ say "Not a teletype." ]</lang>
[ say "Not a teletype." ]</syntaxhighlight>


{{out}}
{{out}}
Line 520: Line 520:


=={{header|Racket}}==
=={{header|Racket}}==
<lang racket>
<syntaxhighlight lang=racket>
(terminal-port? (current-output-port))
(terminal-port? (current-output-port))
</syntaxhighlight>
</lang>


=={{header|Raku}}==
=={{header|Raku}}==
Line 555: Line 555:
<br>On IBM mainframes, a user can have STDIN defined, but the terminal can be ''disconnected''.
<br>On IBM mainframes, a user can have STDIN defined, but the terminal can be ''disconnected''.


<lang rexx>/*REXX program determines if the STDIN is a terminal device or other. */
<syntaxhighlight lang=rexx>/*REXX program determines if the STDIN is a terminal device or other. */
signal on syntax /*if syntax error, then jump ──► SYNTAX*/
signal on syntax /*if syntax error, then jump ──► SYNTAX*/
say 'output device:' testSTDIN() /*displays terminal ──or── other */
say 'output device:' testSTDIN() /*displays terminal ──or── other */
Line 568: Line 568:
end /* [↑] can't use a RETURN here. */
end /* [↑] can't use a RETURN here. */


/* ··· handle other REXX syntax errors here ··· */</lang>
/* ··· handle other REXX syntax errors here ··· */</syntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
{{out|output|text=&nbsp; when using the default input:}}
<pre>
<pre>
Line 591: Line 591:


=={{header|Ruby}}==
=={{header|Ruby}}==
<lang rust>f = File.open("test.txt")
<syntaxhighlight lang=rust>f = File.open("test.txt")
p f.isatty # => false
p f.isatty # => false
p STDOUT.isatty # => true
p STDOUT.isatty # => true
</syntaxhighlight>
</lang>


=={{header|Rust}}==
=={{header|Rust}}==
<lang rust>/* Uses C library interface */
<syntaxhighlight lang=rust>/* Uses C library interface */


extern crate libc;
extern crate libc;
Line 608: Line 608:
println!("stdout is not tty");
println!("stdout is not tty");
}
}
}</lang>
}</syntaxhighlight>


=={{header|Scala}}==
=={{header|Scala}}==
{{Works with|Ubuntu|14.04}}
{{Works with|Ubuntu|14.04}}
<lang scala>import org.fusesource.jansi.internal.CLibrary._
<syntaxhighlight lang=scala>import org.fusesource.jansi.internal.CLibrary._


object IsATty extends App {
object IsATty extends App {
Line 632: Line 632:


println("tty " + apply(true))
println("tty " + apply(true))
}</lang>
}</syntaxhighlight>


=={{header|Standard ML}}==
=={{header|Standard ML}}==
<lang sml>val stdoutRefersToTerminal : bool = Posix.ProcEnv.isatty Posix.FileSys.stdout</lang>
<syntaxhighlight lang=sml>val stdoutRefersToTerminal : bool = Posix.ProcEnv.isatty Posix.FileSys.stdout</syntaxhighlight>


=={{header|Tcl}}==
=={{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> or <code>-xchar</code> channel options, which are only present on serial channels:
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> or <code>-xchar</code> channel options, which are only present on serial channels:
<lang tcl>set toTTY [dict exists [fconfigure stdout] -mode]
<syntaxhighlight lang=tcl>set toTTY [dict exists [fconfigure stdout] -mode]
puts [expr {$toTTY ? "Output goes to tty" : "Output doesn't go to tty"}]</lang>
puts [expr {$toTTY ? "Output goes to tty" : "Output doesn't go to tty"}]</syntaxhighlight>
At the system call level, when Tcl is setting up the channels that correspond to the underlying <tt>stdout</tt> (and <tt>stdin</tt> and <tt>stderr</tt>) file descriptors, it checks whether the channels are network sockets (with <code>getsockname()</code>) or serial lines (with <code>isatty()</code>). This allows Tcl scripts to find out information about their calling environment (e.g., when they are run from <tt>inetd</tt>) with minimal code.
At the system call level, when Tcl is setting up the channels that correspond to the underlying <tt>stdout</tt> (and <tt>stdin</tt> and <tt>stderr</tt>) file descriptors, it checks whether the channels are network sockets (with <code>getsockname()</code>) or serial lines (with <code>isatty()</code>). This allows Tcl scripts to find out information about their calling environment (e.g., when they are run from <tt>inetd</tt>) with minimal code.
{{out|Demonstrating}}
{{out|Demonstrating}}
Line 650: Line 650:
===Channel type discovery with older Tcl versions===
===Channel type discovery with older Tcl versions===
Before Tcl 8.4, this discovery process is impossible; <code>stdout</code> always looks like it is going to a file. With 8.4, you can discover the channel type but you need slightly different (and less efficient, due to the thrown error in the non-tty case) code to do it.
Before Tcl 8.4, this discovery process is impossible; <code>stdout</code> always looks like it is going to a file. With 8.4, you can discover the channel type but you need slightly different (and less efficient, due to the thrown error in the non-tty case) code to do it.
<lang tcl>set toTTY [expr {![catch {fconfigure stdout -mode}]}]</lang>
<syntaxhighlight lang=tcl>set toTTY [expr {![catch {fconfigure stdout -mode}]}]</syntaxhighlight>


=={{header|UNIX Shell}}==
=={{header|UNIX Shell}}==
<lang sh>#!/bin/sh
<syntaxhighlight lang=sh>#!/bin/sh


if [ -t 1 ]
if [ -t 1 ]
Line 660: Line 660:
else
else
echo "Output is NOT a terminal" >/dev/tty
echo "Output is NOT a terminal" >/dev/tty
fi</lang>
fi</syntaxhighlight>


=={{header|Visual Basic .NET}}==
=={{header|Visual Basic .NET}}==
{{trans|C#}}
{{trans|C#}}
<lang vbnet>Module Module1
<syntaxhighlight lang=vbnet>Module Module1


Sub Main()
Sub Main()
Line 670: Line 670:
End Sub
End Sub


End Module</lang>
End Module</syntaxhighlight>


=={{header|Wren}}==
=={{header|Wren}}==
{{trans|C}}
{{trans|C}}
As there is currently no way to obtain this information via Wren CLI, we instead embed a Wren script in a C application and ask the host program to get it for us.
As there is currently no way to obtain this information via Wren CLI, we instead embed a Wren script in a C application and ask the host program to get it for us.
<lang ecmascript>/* check_output_device_is_terminal.wren */
<syntaxhighlight lang=ecmascript>/* check_output_device_is_terminal.wren */


class C {
class C {
Line 681: Line 681:
}
}


System.print("Output device is a terminal = %(C.isOutputDeviceTerminal)")</lang>
System.print("Output device is a terminal = %(C.isOutputDeviceTerminal)")</syntaxhighlight>
<br>
<br>
We now embed this Wren script in the following C program, compile and run it.
We now embed this Wren script in the following C program, compile and run it.
<lang c>#include <stdlib.h>
<syntaxhighlight lang=c>#include <stdlib.h>
#include <unistd.h>
#include <unistd.h>
#include <stdio.h>
#include <stdio.h>
Line 765: Line 765:
free(script);
free(script);
return 0;
return 0;
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 782: Line 782:
=={{header|zkl}}==
=={{header|zkl}}==
On Unix, check to see if stdout's st_mode is a character device.
On Unix, check to see if stdout's st_mode is a character device.
<lang zkl>const S_IFCHR=0x2000;
<syntaxhighlight lang=zkl>const S_IFCHR=0x2000;
fcn S_ISCHR(f){ f.info()[4].bitAnd(S_IFCHR).toBool() }
fcn S_ISCHR(f){ f.info()[4].bitAnd(S_IFCHR).toBool() }
S_ISCHR(File.stdout).println();</lang>
S_ISCHR(File.stdout).println();</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>