catと '>'の違いはファイルをゼロにします。

catと '>'の違いはファイルをゼロにします。

これら2つのコマンドがファイルをゼロにする方法に違いはありますか?後者は前者より短い方法ですか?後ろで何が起こるのか?

両方

$ cat /dev/null > file.txt

$ > file.txt 

生産する

-rw-r--r--  1 user  wheel  0 May 18 10:33 file.txt

答え1

cat /dev/null > file.txt猫の無駄な使用

デフォルトでは何も出力されcat /dev/nullませcatん。はい、うまくいきます。しかし、外部プロセスへの不要な呼び出しを引き起こすので、多くの人が眉をひきます。
これは一般的なために起こっていることの一つです。

justを使用すると、> file.txtほとんどのシェルで動作しますが、完全に移植可能ではありません。完全な移植性が必要な場合は、次の方が良いオプションです。

true > file.txt
: > file.txt

:および/またはtrue出力データでもなく、シェル組み込みcat(外部ユーティリティ)なので、より軽くて「適切」です。

 

修正する:

tylerlが彼のコメントで述べたように、構文もあります>| file.txt

ほとんどのシェルには通過を防ぐ設定があります>。代わりにそれを使用する必要があります>|。これは、実際に添付しようとしたときに人のミスを防ぐためです>>。を使用してこの動作をオンにすることができますset -C

したがって、ファイルを切り取る最も簡単で適切で移植可能な方法は次のとおりです。

:>| file.txt

答え2

移植性の観点から:

                      Bourne POSIX  zsh    csh/tcsh  rc/es  fish
> file                Y      Y      N(1)   N(1)      N      N
: > file              N/Y(2) Y(3)   Y      Y(4)      N(5)   N(5)
true > file           Y(5)   Y      Y      Y(5)      Y(5)   Y(5)
cat /dev/null > file  Y(5)   Y      Y(5)   Y(5)      Y(5)   Y(5)
eval > file           Y(3,8) Y(3)   Y      Y(6)      Y      Y
cp /dev/null file (7) Y(5)   Y      Y(5)   Y(5)      Y(5)   Y(5)
printf '' > file      Y(5)   Y      Y      Y(5)      Y(5)   Y

メモ:

  1. inshまたはkshエミュレーションを除いて、コマンドなしのリダイレクトの場合、zshはデフォルトのコマンドを想定します(catそうでない場合はstdinリダイレクトの場合のみポケットベル)、NULLCMD変数とREADNULLCMD変数を使用して調整できます。これは以下の機能に触発されました。(t)csh
  2. ::UnixV7では、リダイレクトはコメントリーダーと空のコマンドの間で解釈されるため、最初は実行されません。後ですべての組み込み関数と同様に、リダイレクトが失敗した場合はシェルを終了します。
  3. :eval特殊な組み込み関数へのリダイレクトが失敗した場合は、シェルを終了します(bashPOSIXモードでのみ実行されます)。
  4. 興味深いことに、空のラベル(t)cshが定義されているので、そこに枝があります。リダイレクトが失敗した場合は、シェルを終了します。gotogoto ''
  5. そのコマンドが利用できない場合$PATH(通常はそうではありませ:ん。truecatcpprintf
  6. リダイレクトが失敗した場合は、シェルを終了します。
  7. ただし、一部の実装(GNUなど)は、file存在しないファイルを指す場合、シンボリックリンクの作成を拒否します。cp
  8. Bourne シェルの初期バージョンただし、組み込み機能のリダイレクトはサポートされていません。

読みやすさの観点から:

(この部分はとても主観的です。)

  • > file。これは>ヒントやコメントに似ているようです。また、この記事を読むときに私が尋ねたい質問は(ほとんどのシェルが同じ問題について文句を言うでしょう)です。どの出力をリダイレクトしようとしていますか?
  • : > file:ランダムなコマンドを呼び出しました。したがって、それを直接読み取って空のファイルを生成します。しかし、これも:簡単に見逃したり、ヒントとして受け入れることができます。
  • true > file:ブール値は、リダイレクトやファイルの内容とどのような関係がありますか?これはどういう意味ですか?この引用を読んだときに最初に思い浮かぶ考えは次のとおりです。
  • cat /dev/null > file/dev/nullに接続されていますかfile cat通常、ファイルの内容をダンプするコマンドと見なされますが、それでも意味があります。ダンプ内容これファイルを空にしてくださいfile、話すのは少し複雑ですが、cp /dev/null fileそれでも理解できます。
  • cp /dev/null file。コンテンツのコピー空のファイル到着するfilecp基本的に何をするのかわからない人は、デバイスを作成しようとしていると思うかもしれませんが、これは意味がfileありますnull
  • eval > fileまたはeval '' > file。何も実行せずに出力をfile。奇妙なことに、これは一般的なイディオムではありません。
  • printf '' > file: 明らか印刷ファイルには何もありません。私にとって最も意味のあるもの。

パフォーマンスの観点から

違いは、組み込みシェルを使用するかどうかです。そうでない場合は、プロセスを分岐してコマンドをロードして実行する必要があります。

evalすべてのシェルに構築が保証されます。:可能な限りどこに組み込まれています(Bourne / cshが好き)。trueBourneのようなシェルにのみ組み込まれています。

printf最も近代的なBourne型シェルとfish

cpそしてcat一般的に組み込まれていません。

これでcp /dev/null fileシェルリダイレクトは呼び出されないので、次のようになります。

find . -exec cp /dev/null {} \;

以下より効率的です。

find . -exec sh -c '> "$1"' sh {} \;

(必ずしも良いわけではありませんが:

find . -exec sh -c 'for f do : > "$f"; done' sh {} +

)。

個人的には、私はBourneのようなシェルを使い、: > file今はBourneのようなシェル以外には何も使用しません。

答え3

一度見たいと思うかもしれませんtruncate。ファイルを切り取ることです。

たとえば、

truncate --size 0 file.txt

を使用するよりもこれが良いかもしれませんtrue > file.txt

しかし、私の主なポイントは次のとおりです。truncateファイルの切り捨てに使用されますが、>を使用するとファイルが切り捨てられる副作用があります。

答え4

私はこれがよりきれいに見え、誰かが誤ってReturnキーを押したように見えないので、これが好きでよく使用されます。

echo -n "" > file.txt

それも組み込まれているはずですか?

関連情報