19

在正常的 bash 重定向>中,将标准输出重定向到文件,当它存在时覆盖>>并将标准输出重定向到文件,当它存在时附加。

在 tcsh (c shell) 脚本中,我发现了>! >>!正在使用的运算符。这些运营商是做什么的?tcsh 也有>and>>操作符,那有什么区别呢?

4

2 回答 2

38

在 tcsh 重定向中!符号表示覆盖现有文件,即使noclobber已设置。

换句话说,如果 noclobber 被设置,那么:

  • cmd > file如果文件不存在stdout,将写入文件
  • cmd > file如果文件存在将失败
  • cmd >> file如果文件存在,将附加stdout文件
  • cmd >> file如果文件不存在将失败
  • cmd >! file将写入stdout文件覆盖任何现有文件
  • cmd >>! file将追加stdout文件,如果文件不存在则创建文件

如果noclobber设置则 ! 没有效果:

  • cmd > file将写入stdout文件覆盖任何现有文件
  • cmd >> file将附加stdout文件
  • cmd >! file将写入stdout文件覆盖任何现有文件
  • cmd >>! file将附加stdout文件
于 2011-07-20T13:04:07.097 回答
3

在某些情况下,感叹号会禁止检查正在写入的文件类型。

引用 tcsh 手册页:

如果设置了 shell 变量 noclobber,则该文件不得存在或者是字符特殊文件(例如,终端或“/dev/null”)或错误结果。这有助于防止意外破坏文件。在这种情况下,“!” 可以使用表单来禁止此检查。

于 2011-07-20T13:04:30.490 回答