新しいファイルを作成する際に「タッチファイル」と「>ファイル」を使用する場合の違いは何ですか?


13

私はLinuxが初めてです。bashを使用して現在のディレクトリの下に新しいファイル.gitignoreを作成すると、次のことができることがわかりました。

> .gitignore

または

touch .gitignore

彼らは同じことをしているようです。のマニュアルを確認するtouchと、現在のファイルのタイムスタンプの変更と表示されますが、のマニュアルはありません>。だから誰かが何ができるのかを説明でき>ますか?このコンテキストでこれら2つのコマンドを使用するのに違いはありますか?ありがとう。


1
あなたはその使用目的を学習せずに、ファイル・ジェネレータとして「>」を使用することを学んだところ、私は好奇心が強い
forresthopkinsa

1
Bashマニュアルに文書化されたリダイレクトがあります。コマンドラインで、コマンドを入力しman bashます。これは長い文書であり、理解するには数日から数週間かかることもありますが、Bashを徹底的に学習したい場合は経験する価値があります。
水田ランダウ

回答:


21

>シェルのリダイレクト演算子です。シェルコマンドの「>」と「>>」の違いは何ですか?を参照してくださいそして、いつ<または<()または<<および>または>()を使用すべきですか?主に、コマンドの出力をファイルにリダイレクトするために使用されます。ファイルが存在しない場合、シェルはそれを作成します。存在する場合、シェルはそれを切り捨てます(空にします)。だけ> fileでは、コマンドはないため、シェルはファイルを作成しますが、出力は送信されません。そのため、最終的な効果は空のファイルの作成、または既存のファイルの空です。

touch既に知っているように、ファイルを作成するか、タイムスタンプを更新する外部コマンドです。を使用touchすると、とは異なり、ファイルの内容が存在しても失われません>

の動作は>シェルに依存します。bash、dash、およびほとんどのシェルで> fooは、期待どおりに機能します。zshでは、デフォルトで次の> fooように動作しますcat > foo-zshは入力を待ちます。


10
ここで重要なポイントは、間に実用的な違いがないことである>> filetouch file場合にはfile存在しない、それらの両方との間には大きな違いがあります> file(以前の内容があることでfile失われているが)。それに加えて、zshの一貫性のない動作がtouch file「最も安全」であるため、「正しい方法」として記憶する必要があります。
モンティハーダー

1

興味深い比較を次に示します。

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

結果:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472

1
比較は面白いかもしれませんが、ここであなたが私に見たいと思うものは本当に見当たりません。目的を説明できますか?ものをファイルに書き込む方法は異なると思いますが、このように少し混乱します。私のコーヒー不足かもしれません。
m00am

ここに示されている@ m00amは、事実上8つの異なるファイル作成方法です。strace実行されているシステムコールを> file.txt表示することになっています。実行されるシステムコールの量が最小であることが示されています。これは、それほど驚くべきことではありません。示された例の問題は、しかし、それであるstraceために書き込みstderrデフォルトではストリーミング、およびこの回答にスティーブンは、読み取り専用にパイプを使用してstderr、私は少し彼が使用して行をカウントする方法困惑しているので、|パイプとない|&
Sergiy Kolodyazhnyy

そして、Ubuntu 16.04上、使用して|&@Sergが言及したように、私はここのものの約5分のカウントを取得...を除いてvi、私はほぼ同じ値を取得する場合、
muru

WSL?うわー... WSLがそれが何をするのかという多くのシステムコールを追加するは思わなかった。
ムル

@muru Cygwinの- WSLの準備ができていないstackoverflow.com/a/40370009
スティーヴン・ペニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.