Bash Shell避免意外覆盖文件

避免意外覆盖文件,你害怕错误地删除文件内容。输错文件名,发现将输出重定向到了原本打算保存的文件,这种事情太常见了。

解决方案

告诉 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 选项就是一个重要的安全特性了,可以避免不必要的副作用(无论是一时糊涂还是有意为之)。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!