📄 ch15_03.htm
字号:
<HTML><HEAD><TITLE>Recipe 15.2. Testing Whether a Program Is Running Interactively (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen & Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:43:15Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch15_01.htm"TITLE="15. User Interfaces"><LINKREL="prev"HREF="ch15_02.htm"TITLE="15.1. Parsing Program Arguments"><LINKREL="next"HREF="ch15_04.htm"TITLE="15.3. Clearing the Screen"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch15_02.htm"TITLE="15.1. Parsing Program Arguments"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 15.1. Parsing Program Arguments"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch15_01.htm"TITLE="15. User Interfaces"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch15_04.htm"TITLE="15.3. Clearing the Screen"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 15.3. Clearing the Screen"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch15-chap15_testing_0">15.2. Testing Whether a Program Is Running Interactively</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch15-pgfId-239">Problem<ACLASS="indexterm"NAME="ch15-idx-1000005037-0"></A><ACLASS="indexterm"NAME="ch15-idx-1000005037-1"></A><ACLASS="indexterm"NAME="ch15-idx-1000005037-2"></A></A></H3><PCLASS="para">You want to know whether your program is being called interactively or not. For instance, a user running your program from a shell is interactive, whereas the program being called from <EMCLASS="emphasis">cron</EM> is not.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch15-pgfId-245">Solution</A></H3><PCLASS="para"><ACLASS="indexterm"NAME="ch15-idx-1000005045-0"></A>Use <CODECLASS="literal">-t</CODE> to test <CODECLASS="literal">STDIN</CODE> and <CODECLASS="literal">STDOUT</CODE>: <ACLASS="indexterm"NAME="ch15-idx-1000005038-0"></A><ACLASS="indexterm"NAME="ch15-idx-1000005038-1"></A></P><PRECLASS="programlisting">sub I_am_interactive { return -t STDIN && -t STDOUT;}</PRE><PCLASS="para">If you're on a POSIX system, test process groups:</P><PRECLASS="programlisting">use POSIX qw/getpgrp tcgetpgrp/;sub I_am_interactive { local *TTY; # local file handle open(TTY, "/dev/tty") or die "can't open /dev/tty: $!"; my $tpgrp = tcgetpgrp(fileno(TTY)); my $pgrp = getpgrp(); close TTY; return ($tpgrp == $pgrp);}</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch15-pgfId-279">Discussion</A></H3><PCLASS="para">The <BCLASS="emphasis.bold">-t</B> operator tells whether the filehandle or file is a <ACLASS="indexterm"NAME="ch15-idx-1000005044-0"></A>tty device. Such devices are signs of interactive use. This only tells you whether your program has been redirected. Running your program from the shell and redirecting STDIN and STDOUT makes the <BCLASS="emphasis.bold">-t</B> version of <CODECLASS="literal">I_am_interactive</CODE> return false. Called from <EMCLASS="emphasis">cron</EM>, <CODECLASS="literal">I_am_interactive</CODE> also returns false.</P><PCLASS="para">The POSIX test tells you whether your program has exclusive control over its tty. A program whose input and output has been redirected still can control its tty if it wants to, so the POSIX version of <CODECLASS="literal">I_am_interactive</CODE> returns true. A program run from <EMCLASS="emphasis">cron</EM> has no tty, so <CODECLASS="literal">I_am_interactive</CODE> returns false.</P><PCLASS="para">Whichever <CODECLASS="literal">I_am_interactive</CODE> you choose to use, here's how you'd call it:</P><PRECLASS="programlisting">while (1) { if (I_am_interactive()) { print "Prompt: "; } $line = <STDIN>; last unless defined $line; # do something with the line}</PRE><PCLASS="para">Or, more clearly:</P><PRECLASS="programlisting">sub prompt { print "Prompt: " if I_am_interactive() }for (prompt(); $line = <STDIN>; prompt()) { # do something with the line} <ACLASS="indexterm"NAME="ch15-idx-1000005040-0"></A><ACLASS="indexterm"NAME="ch15-idx-1000005040-1"></A><ACLASS="indexterm"NAME="ch15-idx-1000005040-2"></A></PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch15-pgfId-315">See Also</A></H3><PCLASS="para">The documentation for the standard POSIX module, also in <ACLASS="olink"HREF="../prog/ch07_01.htm">Chapter 7</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>; the <BCLASS="emphasis.bold">-t</B> file-test operator in <ACLASS="olink"HREF="../prog/ch03_01.htm">Chapter 3</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A> and in <ICLASS="filename">perlop </I>(1)</P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch15_02.htm"TITLE="15.1. Parsing Program Arguments"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 15.1. Parsing Program Arguments"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch15_04.htm"TITLE="15.3. Clearing the Screen"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 15.3. Clearing the Screen"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">15.1. Parsing Program Arguments</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">15.3. Clearing the Screen</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright © 2002</a> O'Reilly & Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -