Bash Shell有意覆盖文件

你乐于设置 noclobber 选项,但在重定向输出时,偶尔也想覆盖文件。能不能有那么一次可以有意忽略 bash 的好心?

解决方案

使用 >| 重定向输出。即便是设置了 noclobber,bash 也会忽略该选项,并覆盖文件。
思考以下示例:

$ echo something > my.file
$ set -o noclobber
$ echo some more >| my.file                        ➊
$ cat my.file
some more
$ echo once again > my.file                        ➋
bash: my.file: cannot overwrite existing file
$
  • 注意,第二次 echo 并不会产生错误。
  • 但在第三次 echo 中,我们并未用到|,仅仅使用了 > 符号。shell 发出了警告,也并未覆盖现有文件。

讨论

noclobber 的使用并不会代替文件权限。不管有没有使用 >|,如果没有目录的写权限,那么就无法创建文件。与此类似,不管有没有使用 >|,你必须拥有文件的写权限才能覆盖现有文件。

为什么要用 | ?据 Chet 所说,“POSIX 指定了语法 >|,这还是从 ksh88 中选出来的。我也说不清楚 Korn 为什么会选用这种写法。csh 用的是 >!”。为了帮助记忆,你可以将其视为一种强调。它的用法在英语中带有祈使语气,符合要求 bash 在必要时“无论如何”都要覆盖文件的意味。vi 和 ex 编辑器在其 write 命令中也用 ! 表达了相同含义(:w! filename)。如果没有 !,覆盖已有文件时,编辑器会发出抱怨。要是加上 !,就相当于告诉编辑器“做就行了!”。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!