“:>文件”VS“>文件”

时间:2010-03-18 19:09:12

标签: bash shell touch sh

“:>文件”“>文件”之间是否存在差异?

$ : > 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

4 个答案:

答案 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