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 chmod +x filename 2 # 使得文件"filename"对所有用户都可执行. 3 4 chmod u+s filename 5 # 设置"filename"文件的"suid"位. 6 # 这样一般用户就可以在执行"filename"的时候, 拥有和文件宿主相同的权限. 7 # (这并不适用于shell脚本.)</PRE></FONT></TD></TR></TABLE></P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 chmod 644 filename 2 # 对文件"filename"的宿主设置r/w权限, 3 # 对一般用户设置读权限 4 # (8进制模式). </PRE></FONT></TD></TR></TABLE></P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 chmod 1777 directory-name 2 # 对这个目录设置r/w和可执行权限, 并开放给所有人. 3 # 同时设置 "粘贴位". 4 # 这意味着, 只有目录宿主, 5 # 文件宿主, 当然, 6 # 还有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 #!/bin/bash 2 # hello.sh: 显示"hello"还是"goodbye" 3 #+ 依赖于脚本是如何被调用的. 4 5 # 在当前目录下($PWD)为这个脚本创建一个链接: 6 # ln -s hello.sh goodbye 7 # 现在, 通过如下两种方法来调用这个脚本: 8 # ./hello.sh 9 # ./goodbye 10 11 12 HELLO_CALL=65 13 GOODBYE_CALL=66 14 15 if [ $0 = "./goodbye" ] 16 then 17 echo "Good-bye!" 18 # 当然, 在这里你也可以添加一些其他的goodbye类型的命令. 19 exit $GOODBYE_CALL 20 fi 21 22 echo "Hello!" 23 # 当然, 在这里你也可以添加一些其他的hello类型的命令. 24 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 + -
显示快捷键?