“:>文件”和“>文件”之间是否存在差异?
$ : > file.out
$ ls -l file.out
-rw-rw---- 1 user user 0 Mar 18 21:08 file.out
$ > file.out
$ ls -l file.out
-rw-rw---- 1 user user 0 Mar 18 21:08 file.out
答案 0 :(得分:4)
:
是shell内置的NO-OP或null操作。所以是的,将它指向一个文件最终会得到一个空文件,就像没有指向文件一样。我想,有一种感觉,你的来源是一种不同的东西,但结果是一样的。根据{{3}},“> file.out
”表述不适用于某些系统。
请注意,在这两种情况下(与“touch”不同)如果文件已经存在,文件内容将被替换为空。
答案 1 :(得分:4)
使用: > file.out
对非bash更具可移植性。例如,zsh将默认空命令定义为cat
,而不是:
(除非在仿真模式下)。如果你最终需要让脚本使用不是bash的/bin/sh
(例如,* BSD系统,任何闭源操作系统,甚至现在使用dash的某些GNU / Linux发行版) ),如果你使用: > file.out
答案 2 :(得分:2)
根据POSIX,两者都有效,但如果重定向失败,则:
版本会中止,而只有重定向的版本才会返回非零退出状态。在后一种情况下,使用true
更容易使用。
Bash只能在POSIX模式下执行此操作。
名为:
的别名或函数违反了应用程序上的POSIX约束,并且不可移植。
答案 3 :(得分:1)
我能想到的唯一区别是你可以通过别名或函数定义重新定义:
。例如,您可能希望在大多数情况下截断文件(使用:
的默认无操作行为),但在某些情况下强制文件具有标准标头。表单> file
无法重新定义。
例如:
#! /bin/bash
test -n "$ADD_COPYRIGHT" &&
:() { echo "# Copyright (c) 2010 MyName"; echo; }
# Truncate the file to zero size, unless ADD_COPYRIGHT is set, in which case
# the file is truncated to contain only a copyright notice.
: > file
# Add content to the file
some_command >> file