⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intandnonint.html

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>交互与非交互式的交互与非交互式的shell和脚本</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="杂项"HREF="miscellany.html"><LINKREL="PREVIOUS"TITLE="杂项"HREF="miscellany.html"><LINKREL="NEXT"TITLE="Shell包装"HREF="wrapper.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="miscellany.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">33. 杂项</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="wrapper.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="INTANDNONINT">33.1. 交互与非交互式的交互与非交互式的shell和脚本</A></H1><P><EM>交互式</EM>的shell会在<TTCLASS="FILENAME">tty</TT>上从用户输入中读取命令. 	   另一方面, 	   这样的shell能在启动时读取启动文件, 	   显示一个提示符, 并默认激活作业控制. 	   也就是说, 用户可以与shell<EM>交互</EM>. </P><P>shell所运行的脚本通常都是非交互的shell. 		 但是脚本仍然可以访问它的<TTCLASS="FILENAME">tty</TT>. 		 甚至可以在脚本中模拟一个交互式的shell. 	   <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;MY_PROMPT='$ '  3&nbsp;while :  4&nbsp;do  5&nbsp;  echo -n "$MY_PROMPT"  6&nbsp;  read line  7&nbsp;  eval "$line"  8&nbsp;  done  9&nbsp; 10&nbsp;exit 0 11&nbsp; 12&nbsp;# 这个例子脚本, 还有上面那么多的解释 13&nbsp;# 都是由Stephane Chazelas提供的(再次感谢). </PRE></FONT></TD></TR></TABLE></P><P>让我们考虑一个需要用户输入的<EM>交互式</EM>脚本, 		 这种脚本通常都要使用<AHREF="internal.html#READREF">read</A>语句(请参考<AHREF="internal.html#EX36">例子 11-3</A>). 		但是<SPANCLASS="QUOTE">"现实的情况"</SPAN>肯定要比这复杂的多. 		就目前的情况来看, 交互式脚本通常都绑定在一个tty设备上, 		换句话说, 用户都是在控制终端或<ICLASS="FIRSTTERM">xterm</I>上来调用脚本的. </P><P>初始化脚本和启动脚本都是非交互式的, 		因为它们都不需要人为干预, 都是自动运行的. 	   许多管理脚本和系统维护脚本也同样是非交互式的. 	   对于那些不需要经常变化的, 重复性的任务, 应该交给非交互式的脚本来自动完成. 	   </P><P>非交互式的脚本可以在后台运行, 		 但是如果交互式脚本在后台运行的话, 就会被挂起, 		 因为它们在等待永远不会到来的输入. 		 如果想解决后台运行交互式脚本的问题, 		 可以使用带有<BCLASS="COMMAND">expect</B>命令的脚本, 		 或者在脚本中嵌入<AHREF="here-docs.html#HEREDOCREF">here	   document</A>来提供交互式脚本所需要的输入. 	   最简单的办法其实就是将一个文件重定向给<BCLASS="COMMAND">read</B>命令, 	   来提供它所需要的输入(<BCLASS="COMMAND">read variable &#60;file</B>). 	   通过使用上述方法, 就可以编写出通用目的脚本, 	   这种脚本即可以运行在交互模式下, 也可以运行在非交互模式下. 	   </P><P>如果脚本需要测试一下自己是否运行在交互式shell中, 		   那么一个简单的办法就是察看是否存在<EM>提示符(prompt)</EM>变量, 		   也就是察看一下变量<AHREF="internalvariables.html#PS1REF">$PS1</A>是否被设置. 		   (如果脚本需要用户输入, 那么脚本就需要显示提示符.)	   <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if [ -z $PS1 ] # 没有提示符?   2&nbsp;then  3&nbsp;  # 非交互式  4&nbsp;  ...  5&nbsp;else  6&nbsp;  # 交互式  7&nbsp;  ...  8&nbsp;fi</PRE></FONT></TD></TR></TABLE>	   <ANAME="IITEST"></A>另一种办法, 脚本可以测试一下标志<AHREF="internalvariables.html#FLPREF">$-</A>中是否存在选项<SPANCLASS="QUOTE">"i"</SPAN>.            <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;case $- in  2&nbsp;*i*)    # 交互式shell  3&nbsp;;;  4&nbsp;*)      # 非交互式shell  5&nbsp;;;  6&nbsp;# ("UNIX F.A.Q."的惯例, 1993)</PRE></FONT></TD></TR></TABLE></P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>使用<KBDCLASS="USERINPUT">#!/bin/bash -i</KBD>头, 			 或者使用<SPANCLASS="TOKEN">-i</SPAN>选项, 			 可以强制脚本运行在交互模式下. 			 注意, 这么做可能会让脚本产生古怪的行为, 			 有时候即使在没有错误的情况下, 也可能会显示错误信息. 	   </P></TD></TR></TABLE></DIV></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="miscellany.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="wrapper.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">杂项</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="miscellany.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Shell包装</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -