你乐于设置 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
)。如果没有 !,覆盖已有文件时,编辑器会发出抱怨。要是加上 !,就相当于告诉编辑器“做就行了!”。
酷客网相关文章:
评论前必须登录!
注册