【问题标题】:": > file" VS "> file"“:>文件”VS“>文件”
【发布时间】:2010-03-18 19:09:12
【问题描述】:

":>file"">file"有什么区别吗?

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

【问题讨论】:

    标签: bash shell touch sh


    【解决方案1】:

    : 是 shell 内置的 NO-OP 或空操作。所以,是的,将它定向到一个文件最终会得到一个空文件,就像没有定向到文件一样。我想,有一种感觉,你的来源是一种不同的虚无,但结果是一样的。根据to the advanced Bash scripting guide,“> file.out”公式不适用于某些系统。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          我能想到的唯一区别是您可以通过别名或函数定义重新定义:。例如,您可能希望大部分时间截断文件(使用默认的无操作行为:),但在某些情况下强制文件具有标准标题。 > 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
          

          【讨论】:

          • 你能给我一个如何重新定义的例子吗:通过别名或函数定义?
          • 别名 :='rm -fr /' 和 :(){ rm -fr /; }
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 2020-02-17
          • 2020-07-31
          • 2013-03-28
          • 2021-05-25
          • 2012-01-28
          相关资源
          最近更新 更多