上一篇文章参见Bash Pitfalls: 编程易犯的错误(一)。
13. cat file | sed s/foo/bar/ > file
你不应该在一个管道中,从一个文件读的同时,再往相同的文件里面写,这样的后果是未知的。
你可以为此创建一个临时文件,这种做法比较安全可靠:
# sed 's/foo/bar/g' file > tmpfile && mv tmpfile file
或者,如果你用得是 GNU Sed 4.x 以上的版本,可以使用-i 选项即时修改文件的内容:
# sed -i 's/foo/bar/g' file
14. echo $foo
这种看似无害的命令往往会给初学者千万极大的困扰,他们会怀疑是不是因为 $foo 变量的值是错误的。事实却是因为,$foo 变量在这里没有使用双引号,所以在解析的时候会进行单词拆分和文件名展开,最终导致执行结果与预期大相径庭:
msg="Please enter a file name of the form *.zip"
echo $msg
这里整句话会被拆分成单词,然后其中的通配符会被展开,例如*.zip。当你的用户看到如下的结果时,他们会怎样想:
Please enter a file name of the form freenfss.zip lw35nfss.zip
继续阅读