5

“:>文件”“文件”之间有什么区别吗?

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

4 回答 4

4

:是 shell 内置的 NO-OP 或 null 操作。所以是的,将它定向到一个文件最终会得到一个空文件,就像没有定向到文件一样。我想,有一种感觉,你的来源是一种不同的虚无,但结果是一样的。根据高级 Bash 脚本指南,“ > file.out”公式在某些系统上不起作用。

请注意,在这两种情况下(与“触摸”不同),如果文件已经存在,文件内容将被替换为空。

于 2010-03-18T19:15:30.360 回答
4

使用: > file.out对非 bash 来说更便携。例如, zsh 将默认的空命令定义为cat, not :(除非在仿真模式下)。如果您最终需要使脚本与/bin/sh非 bash 一起工作(例如,*BSD 系统、任何闭源操作系统,甚至现在在使用 dash 的某些 GNU/Linux 发行版上),您将如果您使用,让您的生活更轻松: > file.out

于 2010-03-22T03:59:11.453 回答
2

根据 POSIX,两者都可以工作,但:如果重定向失败,则版本会中止,而仅重定向的版本只会返回非零退出状态。在后一种情况下,它更便于使用true

Bash 仅在 POSIX 模式下才能做到这一点。

命名的别名或函数:违反了应用程序的 POSIX 约束并且不可移植。

于 2011-07-31T16:16:47.340 回答
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
于 2010-03-18T21:44:51.073 回答