这是一种元奖,或者说是其他几个奖项的必然结果。它仅仅是一个普遍的观察结果,即带有大量反号的shell脚本通常可以优化和清理uPA批量。这个愚蠢的例子(我已经把它放在另一个页面上)包含了很多选择不当的反号,以及关于他们到底能完成什么的较长讨论,以及如何以不同的方式做到这一点的一些想法。显然,反号是一种有效的构造,您可以在许多shell脚本中很好地使用它们。我只是注意到,新手常常慷慨地把反划线当作他们看到的所有指甲的锤子。有一个特别的习语需要注意,因为它基本上总是错误的,那就是:除了经典的Cahere的无用用法之外,反号是完全危险的,除非你知道反号的结果将小于或等于您的shell可以接受的命令行的长度。(实际上,这是对内核的模仿。您的限制中的常量ARG_MAX。他应该告诉您您自己的系统可以接受多少。POSIX要求ARG_MAX至少为4,096个字节。)。顺便说一句,这也是comp.unix.shell.shell中非常古老的反复出现的主题之一,所以不要犯下发布任何类似于此的内容的错误。要做到这一点,正确的方法是,或者,如果反引号中的命令比单个文件的cat更复杂(无用地使用),当然,ARG_MAX警告也适用于循环以外的其他构造。通常,使用xargs时,看起来像这样的命令通常更安全:典型的示例是在find列出的许多文件中的每个文件上运行一些内容。这里的另一个问题是,find可能会查找名称中包含换行符的文件。GNU find甚至可以通过使用空字符作为文件名分隔符来处理这一问题。#请注意,我们使用-print0而不是-print#这是GNU查找特定选项#类似地,xargs的-0选项是GNU功能find-options-more-options-print0|xargs-r0命令。
使用普通的find,用户可以创建一个名称中有换行符的文件,这会诱使您至少丢失该文件,并且可能会有更危险的东西。(假设您有一个夜间cron作业,该作业以root身份运行,并从/tmp中删除旧文件。现在假设一个恶意用户在/tmp中创建了一个名称以换行符结尾的目录,并在该目录中创建了etc/和etc/passw.然后等待它变得陈旧,或者通过触摸来修改inode的日期戳(.)。如果有些东西仍然不明显,Unix下唯一不允许的文件名字符是空字符和斜杠。如果文件名为/tmp/moo<;newline>;/etc/passwd;,那么普通的find/tmp-print将输出,而xargs将在这里看到两个文件名。将记录分隔符更改为ASCII 0意味着现在文件名跨多行是有效的,因此这不是问题。这是克里斯·汤普森(Chris Thompson)在comp.unix.shell中提出的:所有这些UUOC帖子都让我想起了(Bourne,FTSOE)shell脚本中我最不喜欢的结构之一:如果[$?-ne0];那么ECHO&34;噢,亲爱的,破坏世界失败得很惨";\>;&;2#被你卑微的HTMLizer缩短了,stderr重定向使世界退回了255。
如果破坏世界;那么:;否则,噢,亲爱的,破坏世界失败得很可怕。我还在这里,把世界出口255Fi放回原处。
在我看来要干净得多(即使第#34;THEN#34;子句不能以更经济的方式使用,或者像某些shell一样被省略)。
(上面的wc-l部分也介绍了类似的内容。)。Jon Labadie寄给我以下列表(谢谢!):一些让我烦恼的事情:用于搜索(而不是替换)以';.*';结尾的正则表达式。实际上,任何东西都可以。如果你愿意接受任何东西的零重复,为什么要具体说明呢?AWK脚本基本上被剪切,除非需要重新排序字段。comp.unix.shell中的大小写转换(例如。如何将文件名从UC更改为LC?)。使用tr/sed/awk/?当某些shell具有内置的大小写转换时。基本消除某些字符的复杂方案。例如DOS行到UNIX行。当然要读取dos2unix(1),但是使用sed/awk/.。当";tr-d;^M&34;是所需的全部内容时。全局更改文件使用sed创建一个tmp文件并重命名该tmp文件,此时使用这里的一个文档就可以了。
弗雷德里克·J·塞纳(Frederick J.Sena)评论说,我真的讨厌没用的东西,我真的很讨厌无用的沙子!在那之后,下一个最令人讨厌的事情是人们用无用的chmod 777&34;使文件可写。
这是一个很好的观察结果,也是同样模式的另一个例子;你的工具箱里只有重型大锤,然后用它打碎所有较小的钉子。弗雷德里克还说:我不同意你的观点。
(签名)(令人厌恶的引号)不。请勿使用kill-9。它不会给进程一个干净的机会:1)关闭套接字连接2)清理临时文件3)通知其子进程它即将离开,4)重置其终端特性等等。通常,发送15,然后等待一两秒,如果网络不正常,则发送2,如果不起作用,则发送1。如果不起作用,则发送1。不要仅仅为了清理花盆而拿出联合收割机。这只是Usenet的又一次无用,
(.sign)$ID:awd.prep,v 1.47 2000/12/16 09:24:38 era Exp$