web-dev-qa-db-ja.com

空のファイルを作成するとき、なぜ「:>> file」よりも「touch file」を好むのでしょうか?

今までこれを行うことができることに気づかなかった:

: >> file

機能的には次のようになります。

touch file

ほとんどのリソースがこのShellビルトインよりもタッチを好むように見える理由はありますか?

33
Harold Fischer

:を使用する必要すらありません。 > fileだけを使用できます(少なくともbashでは、他のシェルは異なる動作をする場合があります)。

実際には、ここでは実際の違いはありません(ただし、/bin/touchを呼び出す際のわずかなオーバーヘッドは問題になります)。

ただし、touchを使用して、内容を変更または消去せずに、既存のファイルのタイムスタンプを変更することもできます。さらに、> fileは、すでに存在するfileをすべて消去します。これは>> fileを使用することで回避できます。

touchとのもう1つの違いは、リダイレクションよりも簡潔な構文で複数のファイルを同時に作成(またはタイムスタンプを更新)できることです(たとえば、touch foo bar baz quux)。独自のリダイレクト(例:>foo >bar >baz >quux)。

touchの使用:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

リダイレクトの使用:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
47
DopeGhoti

余分な特殊文字を入力しなくても、一度に複数のファイルをtouchできるからです。これには、ブレース展開などが含まれます。 touch file{1,2,3,4}

もう1つの問題は、チュートリアルを書いているときに、読者が主題にあまり精通していないことを認識することがかなり重要であることです。単純なコマンドは、文字以外の文字の奇妙に見える組み合わせよりもはるかに理解しやすい場合があります。実際にはdo何もしないという単純な理由から、:が何であるかを知らないカジュアルなシェルユーザーが多数いると思います。同様に、コマンドのない単純な> fooの場合:リダイレクトが何であるかを知っていても、リダイレクトsourceなしは直感的でない場合があります。

また、ここunix.seでは、プロンプトを示すために、先頭にドル記号を付けてコマンドサンプルを記述することがよくあります。行頭の特殊文字は混乱するかもしれません。 (デフォルトのプロンプトの一部として>を使用するシステムとシェルがあることに注意してください。)

32
ilkkachu

まあ、私にとって、主な理由は読みやすさです。 touch fileを使用すると、何が起こっているかがわかります。シェルスクリプトの知識があまりない人でも、何が起こっているのかを知っています。そうでない場合は、man touchを実行して簡単に確認できます。

A FILE argument that does not exist is created empty

:>などの不可解なものを使用すると、何が起こっているのかを知るのが難しくなります。実際の利点がないため、それを使用する必要はありません。

18
yo'

/ tmpにマーカーファイルが作成されていることだけを覚えている古いシェルスクリプトの1つを探しているとします。 Wordの "touch"用にすべての* .shファイルをgrepするのは簡単です。検索する正確なファイル名がわからない場合は、代わりにコロンを入力すると、多くの誤検知が発生します。

6
B from C