internalvariables.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 3,354 行 · 第 1/4 页

HTML
3,354
字号
><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>在2.05以后的Bash版本中,	    文件名匹配(filename globbing)将不在区分中括号结构中的字符范围里字符的大小写. 	    比如, <BCLASS="COMMAND">ls [A-M]*</B>		既能够匹配为<TTCLASS="FILENAME">File1.txt</TT>也能够匹配为<TTCLASS="FILENAME">file1.txt</TT>. 		为了能够恢复中括号里字符的匹配行为(即区分大小写), 	    可以设置变量<CODECLASS="VARNAME">LC_COLLATE</CODE>为<CODECLASS="OPTION">C</CODE>, 		在文件<TTCLASS="FILENAME">/etc/profile</TT>或<TTCLASS="FILENAME">~/.bashrc</TT>中使用<KBDCLASS="USERINPUT">export LC_COLLATE=C</KBD>, 		可以达到这个目的.</P></TD></TR></TABLE></DIV></DD><DT><CODECLASS="VARNAME">$LC_CTYPE</CODE></DT><DD><P>这个内部变量用来控制<AHREF="globbingref.html">通配(globbing)</A>和模式匹配中的字符串解释. </P></DD><DT><ANAME="LINENOREF"></A><CODECLASS="VARNAME">$LINENO</CODE></DT><DD><P>这个变量用来记录自身在脚本中所在的行号. 			  这个变量只有在脚本使用这个变量的时候才有意义, 			 并且这个变量一般用于调试目的. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# *** 调试代码块开始 ***  2&nbsp;last_cmd_arg=$_  # Save it.  3&nbsp;  4&nbsp;echo "At line number $LINENO, variable \"v1\" = $v1"  5&nbsp;echo "Last command argument processed = $last_cmd_arg"  6&nbsp;# *** 调试代码块结束 ***</PRE></FONT></TD></TR></TABLE></P></DD><DT><ANAME="MACHTYPEREF"></A><CODECLASS="VARNAME">$MACHTYPE</CODE></DT><DD><P>机器类型</P><P>标识系统的硬件.</P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $MACHTYPE</KBD><SAMPCLASS="COMPUTEROUTPUT">i686</SAMP></PRE></FONT></TD></TR></TABLE></DD><DT><ANAME="OLDPWD"></A><CODECLASS="VARNAME">$OLDPWD</CODE></DT><DD><P>之前的工作目录(<SPANCLASS="QUOTE">"OLD-print-working-directory"</SPAN>,	    就是之前你所在的目录)</P></DD><DT><CODECLASS="VARNAME">$OSTYPE</CODE></DT><DD><P>操作系统类型</P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $OSTYPE</KBD><SAMPCLASS="COMPUTEROUTPUT">linux</SAMP></PRE></FONT></TD></TR></TABLE></DD><DT><ANAME="PATHREF"></A><CODECLASS="VARNAME">$PATH</CODE></DT><DD><P>可执行文件的搜索路径, 			 一般为<TTCLASS="FILENAME">/usr/bin/</TT>, 	      <TTCLASS="FILENAME">/usr/X11R6/bin/</TT>, 	      <TTCLASS="FILENAME">/usr/local/bin</TT>, 等等.</P><P>当给出一个命令时, shell会自动生成一张哈希(hash)表,  		  并且在这张哈希表中按照<EM>path</EM>变量中所列出的路径来搜索这个可执行命令.		  路径会存储在<AHREF="othertypesv.html#ENVREF">环境变量</A>中, 		  <CODECLASS="VARNAME">$PATH</CODE>变量本身就一个以冒号分隔的目录列表. 		  通常情况下, 系统都是在<TTCLASS="FILENAME">/etc/profile</TT>和<TTCLASS="FILENAME">~/.bashrc</TT>中存储<CODECLASS="VARNAME">$PATH</CODE>的定义.	      (参考<AHREF="files.html">Appendix G</A>).</P><P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><BCLASS="COMMAND">echo $PATH</B><SAMPCLASS="COMPUTEROUTPUT">/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/sbin:/usr/sbin</SAMP></PRE></FONT></TD></TR></TABLE>              </P><P><KBDCLASS="USERINPUT">PATH=${PATH}:/opt/bin</KBD>将会把目录<TTCLASS="FILENAME">/opt/bin</TT>附加到当前目录列表中.			在脚本中, 这是一种把目录临时添加到$PATH中的权宜之计. 			当这个脚本退出时, <CODECLASS="VARNAME">$PATH</CODE>将会恢复以前的值(一个子进程, 比如说一个脚本,			是不能够修改父进程的环境变量的, 在这里也就是不能够修改shell本身的环境变量, 			-- 译者注: 也就是脚本所运行的这个shell). </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>当前的<SPANCLASS="QUOTE">"工作目录"</SPAN>, 				<TTCLASS="FILENAME">./</TT>, 通常是不会出现在<CODECLASS="VARNAME">$PATH</CODE>中的, 				这样做的目的是出于安全的考虑. </P></TD></TR></TABLE></DIV></DD><DT><CODECLASS="VARNAME">$PIPESTATUS</CODE></DT><DD><P>这个<AHREF="arrays.html#ARRAYREF">数组</A>变量将保存最后一个运行的<EM>前台</EM><AHREF="special-chars.html#PIPEREF">管道</A>的退出状态码. 		  相当有趣的是, 这个退出状态码和最后一个命令运行的<AHREF="exit-status.html#EXITSTATUSREF">退出状态码</A>并不一定相同. </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $PIPESTATUS</KBD><SAMPCLASS="COMPUTEROUTPUT">0</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">ls -al | bogus_command</KBD><SAMPCLASS="COMPUTEROUTPUT">bash: bogus_command: command not found</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $PIPESTATUS</KBD><SAMPCLASS="COMPUTEROUTPUT">141</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">ls -al | bogus_command</KBD><SAMPCLASS="COMPUTEROUTPUT">bash: bogus_command: command not found</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $?</KBD><SAMPCLASS="COMPUTEROUTPUT">127</SAMP>	      </PRE></FONT></TD></TR></TABLE>	      </P><P><CODECLASS="VARNAME">$PIPESTATUS</CODE>数组的每个成员都保存了运行在管道中的相应命令的退出状态码. 		<CODECLASS="VARNAME">$PIPESTATUS[0]</CODE>保存管道中第一个命令的退出状态码.		<CODECLASS="VARNAME">$PIPESTATUS[1]</CODE>保存第二个命令的退出状态码, 依此类推. </P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>	      <CODECLASS="VARNAME">$PIPESTATUS</CODE>变量在一个登陆的shell中可能会包含一个不正确<SPANCLASS="ERRORCODE">0</SPAN>值(在3.0以下版本).              </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">tcsh% </SAMP><KBDCLASS="USERINPUT">bash</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">who | grep nobody | sort</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo ${PIPESTATUS[*]}</KBD><SAMPCLASS="COMPUTEROUTPUT">0</SAMP>	      </PRE></FONT></TD></TR></TABLE>	      </P><P>	      如果一个脚本包含了上边的这行, 那么将会产生我们所期望的<SAMPCLASS="COMPUTEROUTPUT">0 1 0</SAMP>的输出.              </P><P>	      感谢, Wayne Pollock指出这一点并提供了上边的例子. 	      </P></TD></TR></TABLE></DIV><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>在某些上下文中, 变量<CODECLASS="VARNAME">$PIPESTATUS</CODE>可能不会给出期望的结果. </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $BASH_VERSION</KBD><SAMPCLASS="COMPUTEROUTPUT">3.00.14(1)-release</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">$ ls | bogus_command | wc</KBD><SAMPCLASS="COMPUTEROUTPUT">bash: bogus_command: command not found 0       0       0</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo ${PIPESTATUS[@]}</KBD><SAMPCLASS="COMPUTEROUTPUT">141 127 0</SAMP>	      </PRE></FONT></TD></TR></TABLE>	      </P><P>Chet Ramey把上边输出不正确的原因归咎于<AHREF="basic.html#LSREF">ls</A>的行为. 			 因为如果把<EM>ls</EM>的结果放到管道上, 并且这个输出并没有被读取, 			 那么SIGPIPE将会杀掉它, 同时<AHREF="exit-status.html#EXITSTATUSREF">退出状态码</A>变为<SPANCLASS="RETURNVALUE">141</SPAN>. 			 而不是我们所期望的<SPANCLASS="RETURNVALUE">0</SPAN>. 		这种情况也会发生在<AHREF="textproc.html#TRREF">tr</A>命令中.</P></TD></TR></TABLE></DIV><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><CODECLASS="VARNAME">$PIPESTATUS</CODE>是一个<SPANCLASS="QUOTE">"不稳定"</SPAN>变量. 				这个变量需要在任何命令干涉之前, 并在管道询问之后立刻被查询. </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">$ ls | bogus_command | wc</KBD><SAMPCLASS="COMPUTEROUTPUT">bash: bogus_command: command not found 0       0       0</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo ${PIPESTATUS[@]}</KBD><SAMPCLASS="COMPUTEROUTPUT">0 127 0</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo ${PIPESTATUS[@]}</KBD><SAMPCLASS="COMPUTEROUTPUT">0</SAMP>	      </PRE></FONT></TD></TR></TABLE>	      </P></TD></TR></TABLE></DIV></DD><DT><ANAME="PPIDREF"></A><CODECLASS="VARNAME">$PPID</CODE></DT><DD><P></P><P>进程的<CODECLASS="VARNAME">$PPID</CODE>就是这个进程的父进程的进程ID(<CODECLASS="VARNAME">pid</CODE>).	      <ANAME="AEN4091"HREF="#FTN.AEN4091"><SPANCLASS="footnote">[1]</SPAN></A>	      </P><P>和<AHREF="system.html#PIDOFREF">pidof</A>命令比较一下.</P></DD><DT><CODECLASS="VARNAME">$PROMPT_COMMAND</CODE></DT><DD><P>这个变量保存了在主提示符<CODECLASS="VARNAME">$PS1</CODE>显示之前需要执行的命令. </P></DD><DT><ANAME="PS1REF"></A><CODECLASS="VARNAME">$PS1</CODE></DT><DD><P>这是主提示符, 可以在命令行中见到它. </P></DD><DT><CODECLASS="VARNAME">$PS2</CODE></DT><DD><P><ANAME="SECPROMPTREF"></A></P><P>第二提示符, 当你需要额外输入的时候, 你就会看到它. 默认显示<SPANCLASS="QUOTE">"&#62;"</SPAN>.</P></DD><DT><CODECLASS="VARNAME">$PS3</CODE></DT><DD><P>第三提示符, 它在一个<AHREF="testbranch.html#SELECTREF">select</A>循环中显示(参见<AHREF="testbranch.html#EX31">例子 10-29</A>).</P></DD><DT><CODECLASS="VARNAME">$PS4</CODE></DT><DD><P>第四提示符, 当你使用<SPANCLASS="TOKEN">-x</SPAN><AHREF="options.html#OPTIONSREF">选项</A>来调用脚本时,	    这个提示符会出现在每行输出的开头. 默认显示<SPANCLASS="QUOTE">"+"</SPAN>.</P></DD><DT><ANAME="PWDREF"></A><CODECLASS="VARNAME">$PWD</CODE></DT><DD><P>工作目录(你当前所在的目录)</P><P>这与内建命令<AHREF="internal.html#PWD2REF">pwd</A>作用相同. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONT

⌨️ 快捷键说明

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