basic.html

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

HTML
1,396
字号
>rm -badname</KBD><SAMPCLASS="COMPUTEROUTPUT">rm: invalid option -- b Try `rm --help' for more information.</SAMP></PRE></FONT></TD></TR></TABLE>	      </P><P>解决这个问题的一个方法就是在要删除的文件的前边加上<EM>./</EM> .	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">rm ./-badname</KBD></PRE></FONT></TD></TR></TABLE>	        		另一种解决的方法是在文件名前边加上<SPANCLASS="QUOTE">" -- "</SPAN>.	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">rm -- -badname</KBD></PRE></FONT></TD></TR></TABLE>	      </P></TD></TR></TABLE></DIV><DIVCLASS="WARNING"><P></P><TABLECLASS="WARNING"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/warning.gif"HSPACE="5"ALT="Warning"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>当使用递归参数<CODECLASS="OPTION">-r</CODE>时, 				这个命令将会删除整个目录树. 	      如果不慎的使用<BCLASS="COMMAND">rm -rf *</B>的话, 	      那整个目录树就真的完了. </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">rmdir</B></DT><DD><P>删除目录. 但是只有这个目录中没有文件的时候	      -- 当然会包含<SPANCLASS="QUOTE">"不可见的"</SPAN><EM>点文件</EM>		<ANAME="AEN7278"HREF="#FTN.AEN7278"><SPANCLASS="footnote">[1]</SPAN></A>	      -- 这个命令才会成功. </P></DD><DT><BCLASS="COMMAND">mkdir</B></DT><DD><P>生成目录, 创建一个空目录. 比如,			<KBDCLASS="USERINPUT">mkdir -p project/programs/December</KBD>将会创建指定的目录, 			即使project目录和programs目录都不存在.			<TTCLASS="REPLACEABLE"><I>-p</I></TT>选项将会自动产生必要的父目录, 			这样也就同时创建了多个目录. 		</P></DD><DT><ANAME="CHMODREF"></A><BCLASS="COMMAND">chmod</B></DT><DD><P>修改一个现存文件的属性(请参考<AHREF="internal.html#EX44">例子 11-12</A>).</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;chmod +x filename  2&nbsp;# 使得文件"filename"对所有用户都可执行.  3&nbsp;  4&nbsp;chmod u+s filename  5&nbsp;# 设置"filename"文件的"suid"位.  6&nbsp;# 这样一般用户就可以在执行"filename"的时候, 拥有和文件宿主相同的权限.  7&nbsp;# (这并不适用于shell脚本.)</PRE></FONT></TD></TR></TABLE></P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;chmod 644 filename  2&nbsp;# 对文件"filename"的宿主设置r/w权限,   3&nbsp;# 对一般用户设置读权限  4&nbsp;# (8进制模式). </PRE></FONT></TD></TR></TABLE></P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;chmod 1777 directory-name  2&nbsp;# 对这个目录设置r/w和可执行权限, 并开放给所有人.  3&nbsp;# 同时设置 "粘贴位".  4&nbsp;# 这意味着, 只有目录宿主,  5&nbsp;# 文件宿主, 当然,   6&nbsp;# 还有root可以删除这个目录中的任何特定的文件.</PRE></FONT></TD></TR></TABLE></P></DD><DT><BCLASS="COMMAND">chattr</B></DT><DD><P>修改文件属性. 			  这个命令与上边的<BCLASS="COMMAND">chmod</B>命令项类似, 			  但是有不同的选项和不同的调用语法, 			  并且这个命令只能工作在<EM>ext2</EM>文件系统中. </P><P><BCLASS="COMMAND">chattr</B>命令的一个特别有趣的选项是<CODECLASS="OPTION">i</CODE>. 			 <BCLASS="COMMAND">chattr +i <TTCLASS="FILENAME">filename</TT></B>将使得这个文件被标记为永远不变. 	      这个文件将不能被修改, 连接, 或删除,		  <EM>即使是root也不行</EM>. 		  这个文件属性只能被root设置和删除. 		  类似的, <CODECLASS="OPTION">a</CODE>选项将会把文件标记为只能追加数据	      </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">chattr +i file1.txt</KBD><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">rm file1.txt</KBD><SAMPCLASS="COMPUTEROUTPUT">rm: remove write-protected regular file `file1.txt'? y rm: cannot remove `file1.txt': Operation not permitted</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P><P>如果文件设置了<CODECLASS="OPTION">s</CODE>(安全)属性, 			那么当这个文件被删除时, 这个文件所在磁盘的块将全部被0填充. </P><P>如果文件设置了<CODECLASS="OPTION">u</CODE>(不可删除)属性, 那么当这个文件被删除后, 			这个文件的内容还可以被恢复(不可删除). </P><P>如果文件设置了<CODECLASS="OPTION">c</CODE>(压缩)属性, 			那么当这个文件在进行写操作时, 它将自动被压缩, 			并且在读的时候, 自动解压.	      </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>使用<BCLASS="COMMAND">chattr</B>命令设置过属性的文件将不会显示在文件列表中(<BCLASS="COMMAND">ls 					  -l</B>).</P></TD></TR></TABLE></DIV></DD><DT><ANAME="LINKREF"></A><BCLASS="COMMAND">ln</B></DT><DD><P>创建文件链接, 前提是这个文件是存在的. 			  <SPANCLASS="QUOTE">"链接"</SPAN>就是一个文件的引用, 			  也就是这个文件的另一个名字. 			  <BCLASS="COMMAND">ln</B>命令允许对同一个文件引用多个链接, 			  并且是避免混淆的一个很好的方法(请参考<AHREF="othertypesv.html#EX18">例子 4-6</A>).</P><P><BCLASS="COMMAND">ln</B>对于文件来说只不过是创建了一个引用, 				  一个指针而已, 因为创建出来的连接文件只有几个字节. 			  </P><P><ANAME="SYMLINKREF"></A></P><P>绝大多数使用<BCLASS="COMMAND">ln</B>命令时, 				使用的是<CODECLASS="OPTION">-s</CODE>选项, 				可以称为符号链接, 或<SPANCLASS="QUOTE">"软"</SPAN>链接. 				使用<CODECLASS="OPTION">-s</CODE>标志的一个优点是它可以穿越文件系统来链接目录. 	      </P><P>关于使用这个命令的语法还是有点小技巧的. 			  比如: <KBDCLASS="USERINPUT">ln -s oldfile newfile</KBD>将对之前存在的<TTCLASS="FILENAME">oldfile</TT>产生一个新的连接, 	      <TTCLASS="FILENAME">newfile</TT>. </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>如果之前<TTCLASS="FILENAME">newfile</TT>已经存在的话, 	      将会产生一个错误信息. </P></TD></TR></TABLE></DIV><TABLECLASS="SIDEBAR"BORDER="1"CELLPADDING="5"><TR><TD><DIVCLASS="SIDEBAR"><ANAME="AEN7379"></A><P><B>使用链接中的哪种类型?</B></P><P>就像John Macdonald解释的那样: </P><P>不论是那种类型的链接, 都提供了一种双向引用的手段 -- 也就是说, 			  不管你用文件的哪个名字对文件内容进行修改, 			  你修改的效果都即会影响到原始名字的文件, 			  也会影响到链接名字的文件. 当你工作在更高层次的时候, 			  才会发生软硬链接的不同. 硬链接的优点是, 原始文件与链接文件之间是相互独立的 			  -- 如果你删除或者重命名旧文件, 那么这种操作将不会影响硬链接的文件, 			  硬链接的文件讲还是原来文件的内容. 然而如果你使用软链接的话, 			  当你把旧文件删除或重命名后, 软链接将再也找不到原来文件的内容了. 			  而软链接的优点是它可以跨越文件系统(因为它只不过是文件名的一个引用, 			  而并不是真正的数据). 与硬链接的另一个不同是, 			  一个符号链接可以指向一个目录.</P></DIV></TD></TR></TABLE><P>链接给出了一种可以用多个名字来调用脚本的能力(当然这也适用于任何其他可执行的类型), 	并且脚本的行为将依赖于脚本是如何被调用的. </P><DIVCLASS="EXAMPLE"><HR><ANAME="HELLOL"></A><P><B>例子 12-2. 到底是Hello还是Good-bye</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# hello.sh: 显示"hello"还是"goodbye"  3&nbsp;#+          依赖于脚本是如何被调用的.   4&nbsp;  5&nbsp;# 在当前目录下($PWD)为这个脚本创建一个链接:  6&nbsp;#    ln -s hello.sh goodbye  7&nbsp;# 现在, 通过如下两种方法来调用这个脚本:  8&nbsp;# ./hello.sh  9&nbsp;# ./goodbye 10&nbsp; 11&nbsp; 12&nbsp;HELLO_CALL=65 13&nbsp;GOODBYE_CALL=66 14&nbsp; 15&nbsp;if [ $0 = "./goodbye" ] 16&nbsp;then 17&nbsp;  echo "Good-bye!" 18&nbsp;  # 当然, 在这里你也可以添加一些其他的goodbye类型的命令. 19&nbsp;  exit $GOODBYE_CALL 20&nbsp;fi 21&nbsp; 22&nbsp;echo "Hello!" 23&nbsp;# 当然, 在这里你也可以添加一些其他的hello类型的命令. 24&nbsp;exit $HELLO_CALL</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><BCLASS="COMMAND">man</B>, <BCLASS="COMMAND">info</B></DT><DD><P>这两个命令用来查看系统命令或安装工具的手册和信息. 			  当两者都可用时, 	      <EM>info</EM>页一般会比<EM>man</EM>页包含更多的细节描述. </P></DD></DL></DIV></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN7278"HREF="basic.html#AEN7278"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><ANAME="DOTFILESREF"></A></P><P><EM>点文件</EM>就是文件名以<EM>点</EM>开头的文件, 				  比如<TTCLASS="FILENAME">~/.Xdefaults</TT>. 				  当使用一般的<BCLASS="COMMAND">ls</B>命令时, 				 这样的文件是不会被显示出来的. 				 (当然<BCLASS="COMMAND">ls -a</B>会显示它们), 				 所以它们也不会被意外的<BCLASS="COMMAND">rm -rf *</B>命令所删除. 				 在用户的home目录中, 点文件一般被用作安装和配置文件.		    </P></TD></TR></TABLE><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="external.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="moreadv.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">外部过滤器, 程序和命令</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="external.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">复杂命令</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

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