日期:2014-05-16  浏览次数:20631 次

UNIX 高手的 20 个习惯[]
    不良的使用模式会降低您的速度,并且通常会导致意外错误。养成这些好习惯是加强您的 unix 命令行技能的积极步骤。<br><br><br>unix 下要采用的20个好习惯为:<br><br>1)??????? 在单个命令中创建目录树。<br><br>2)??????? 更改路径;不要移动存档。<br><br>3)??????? 将命令与控制操作符组合使用。<br><br>4)??????? 谨慎引用变量。<br><br>5)??????? 使用转义序列来管理较长的输入。<br><br>6)??????? 在列表中对命令分组。<br><br>7)??????? 在 find 之外使用 xargs 。<br><br>8)??????? 了解何时 grep 应该执行计数——何时应该绕过。<br><br>9)??????? 匹配输出中的某些字段,而不只是对行进行匹配。<br><br>10)??? 停止对 cat 使用管道。<br><br>11)??? 使用文件名自动完成功能 (file name completion)。<br><br>12)??? 使用历史扩展。<br><br>13)??? 重用以前的参数。<br><br>14)??? 使用 pushd 和 popd 管理目录导航。<br><br>15)??? 查找大型文件。<br><br>16)??? 不使用编辑器创建临时文件。<br><br>17)??? 使用 curl 命令行实用工具。<br><br>18)??? 最有效地利用正则表达式。<br><br>19)??? 确定当前用户。<br><br>20)??? 使用 awk 处理数据。<br><br>?<br><br>1. 在单个命令中创建目录树<br><br>清单 1 演示了最常见的 unix 坏习惯之一:一次定义一个目录树。<br><br>?<br><br>清单 1. 坏习惯 1 的示例:单独定义每个目录树<br><br>~ $ mkdir tmp<br><br>~ $ cd tmp<br><br>~/tmp $ mkdir a<br><br>~/tmp $ cd a<br><br>~/tmp/a $ mkdir b<br><br>~/tmp/a $ cd b<br><br>~/tmp/a/b/ $ mkdir c<br><br>~/tmp/a/b/ $ cd c<br><br>~/tmp/a/b/c $<br><br>?<br><br>?????? 使用 mkdir 的 -p 选项并在单个命令中创建所有父目录及其子目录要容易得多。但是即使对于知道此选项的管理员,他们在命令行上创建子目录时也仍然束缚于逐步创建每级子目录。花时间有意识地养成这个好习惯是值得的.<br><br><br>?清单 2. 好习惯 1 的示例:使用一个命令来定义目录树<br><br>~ $ mkdir -p tmp/a/b/c<br><br>?<br><br>?????? 您可以使用此选项来创建整个复杂的目录树(在脚本中使用是非常理想的),而不只是创建简单的层次结构。<br><br><br>?清单 3. 好习惯 1 的另一个示例:使用一个命令来定义复杂的目录树<br><br>~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}<br><br>?<br><br>?????? 过去,单独定义目录的唯一借口是您的 mkdir 实现不支持此选项,但是在大多数系统上不再是这样了。ibm、aix?、mkdir、gnu mkdir 和其他遵守单一 unix 规范 (single unix specification) 的系统现在都具有此选项。<br><br>?????? 对于仍然缺乏该功能的少数系统,您可以使用 mkdirhier 脚本(请参见参考资料),此脚本是执行相同功能的 mkdir 的包装:<br><br>~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}<br><br>?<br><br>2. 更改路径;不要移动存档<br><br>?????? 另一个不良的使用模式是将 .tar 存档文件移动到某个目录,因为该目录恰好是您希望在其中提取 .tar 文件的目录。其实您根本不需要这样做。您可以随心所欲地将任何 .tar 存档文件解压缩到任何目录——这就是 -c 选项的用途。在解压缩某个存档文件时,使用 -c 选项来指定要在其中解压缩该文件的目录:<br><br><br>清单 4. 好习惯 2 的示例:使用选项 -c 来解压缩 .tar 存档文件<br><br>~ $ tar xvf -c tmp/a/b/c newarc.tar.gz<br><br>?<br><br>?????? 相对于将存档文件移动到您希望在其中解压缩它的位置,切换到该目录,然后才解压缩它,养成使用 -c 的习惯则更加可取——当存档文件位于其他某个位置时尤其如此。<br><br>?<br><br>3. 将命令与控制操作符组合使用<br><br>?????? 您可能已经知道,在大多数 shell 中,您可以在单个命令行上通过在命令之间放置一个分号 (;) 来组合命令。该分号是 shell 控制操作符,虽然它对于在单个命令行上将离散的命令串联起来很有用,但它并不适用于所有情况。例如,假设您使用分号来组合两个命令,其中第二个命令的正确执行完全依赖于第一个命令的成功完成。如果第一个命令未按您预期的那样退出,第二个命令仍然会运行——结果会导致失败。相反,应该使用更适当的控制操作符(本文将描述其中的部分操作符)。只要您的 shell 支持它们,就值得养成使用它们的习惯。<br><br>?<br><br>3.1 仅当另一个命令返回零退出状态时才运行某个命令<br><br>?????? 使用 &amp;&amp; 控制操作符来组合两个命令,以便仅当 第一个命令返回零退出状态时才运行第二个命令。换句话说,如果第一个命令运行成功,则第二个命令将运行。如果第一个命令失败,则第二个命令根本就不运行。例如:<br><br><br>清单 5. 好习惯 3 的示例:将命令与控制操作符组合使用<br><br>~ $ cd tmp/a/b/c &amp;&amp; tar xvf ~/archive.tar<br><br>?<br><br>?????? 在此例中,存档的内容将提取到 ~/tmp/a/b/c 目录中,除非该目录不存在。如果该目录不存在,则 tar 命令不会运行,因此不会提取任何内容。<br><br>?<br><br>3.2 仅当另一个命令返回非零退出状态时才运行某个命令<br><br>?????? 类似地,|| 控制操作符分隔两个命令,并且仅当第一个命令返回非零退出状态时才运行第二个命令。换句话说,如果第一个命令成功,则第二个命令不会运行。如果第一个命令失败,则第二个命令才会 运行。在测试某个给定目录是否存在时,通常使用此操作符,如果该目录不存在,则创建它:<br><br><br>清单 6. 好习惯 3 的另一个示例:将命令与控制操作符组合使用<br><br>~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c<br