5

": > 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
4

4 に答える 4

4

:シェル組み込み NO-OP またはヌル操作です。つまり、ファイルに何も送信しない場合と同様に、ファイルに送信すると空のファイルになります。あなたのソースは別の種類の無であるという意味があると思いますが、結果は同じです。高度な Bash スクリプト ガイドによると、" > file.out" 式は一部のシステムでは機能しません。

どちらの場合も (「touch」とは異なり)、ファイルが既に存在する場合、ファイルの内容は何も置き換えられないことに注意してください。

于 2010-03-18T19:15:30.360 に答える
4

を使用: > file.outすると、非 bash への移植性が向上します。たとえば、zsh はデフォルトのヌル コマンドをcat, not :(エミュレーション モードでない限り) として定義します。スクリプトを bash 以外で動作させる必要が/bin/sh生じた場合 (たとえば、*BSD システム、ソースがクローズドな OS、またはダッシュが使用されている一部の 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 に答える