避免意外覆盖文件,你害怕错误地删除文件内容。输错文件名,发现将输出重定向到了原本打算保存的文件,这种事情太常见了。
解决方案
告诉 shell 更加谨慎:
set -o noclobber
如果你觉得完全用不着这么小心翼翼,可以关闭该选项:
set +o noclobber
讨论
noclobber 选项告诉 bash 在重定向输出时不要覆盖任何现有文件。如果重定向输出的文件尚不存在,一切照常进行,由 bash 创建该文件并将其打开以供输出之用。如果文件已经存在,则产生错误消息。
我们来实际演练一下。先关闭该选项,这只是为了让 shell 处于已知状态,不管特定系统先前是怎么配置的:
$ set +o noclobber ➊
$ echo something > my.file ➋
$ echo some more > my.file
$ set -o noclobber ➌
$ echo something > my.file
bash: my.file: cannot overwrite existing file
$ echo some more >> my.file1 ➍
$
- ❶ 第一次,我们将输出重定向到 my.file,bash 会为我们创建该文件。
- ❷ 第二次,我们又将输出重定向到 my.file,bash 覆盖了该文件(它将文件截断为 0 字节并从头写入)。
- ❸ 设置 noclobber 选项,再次试图重定向到该文件时,我们得到了错误消息。
- ❹ 就像示例中显示的,我们可以(用 >>)向该文件中追加内容。
注意!noclobber 选项仅针对 shell 重定向输出时的文件覆盖行为。它并不能阻止其他程序覆盖文件:
$ echo useless data > some.file
$ echo important data > other.file
$ set -o noclobber
$ cp some.file other.file
$
这里并不会出现错误。现有文件被 cp 命令覆盖了。noclobber 选项在这种情况下不起作用。
如果你敲代码时又快又好,这看起来似乎不是一个重要的选项,但在其他实例中,我们会探究由正则表达式生成或以变量传递的文件名,它们均能用于输出重定向。在这种情况下,noclobber 选项就是一个重要的安全特性了,可以避免不必要的副作用(无论是一时糊涂还是有意为之)。
酷客网相关文章:
评论前必须登录!
注册