回答:
この場合、リダイレクトの両方の方法(>と>>)の間で把握する必要がある基本的なことは次のとおりです。
指し示された情報をリダイレクトして上書きします。これは、パイプ "|"を介して情報を受信しているときに発生します
指示された情報にリダイレクトして連結します。これは、パイプ "|"を介して情報を受信しているときに発生します
どちらの場合も、ファイルが存在しない場合は、代わりに作成されます。「>>」でのみ、同じファイルで再度実行すると情報が連結されます。">"を使用すると、最初の実行時に行ったすべてのことを単純に上書きします。
しかし、ここでは出力ファイルと同じ入力ファイルを使用する場合の取り決めがあります。その特定の場合、「>」を使用すると、出力ファイルが「上書き」するため、「入力」部分が解析する必要のある情報が削除されます。だから:
rev file.txt | cat > file.txt
「スローモーション解説」で実際に起こっているのは:
rev
の内容を反転file.txt
してパイプに送信する準備をしますrev
がパイプに情報を送信している間、パイプはそれを直接にストリーミングしcat
ます。cat
情報を受信している間、file.txt
設定された情報に自動的に適用されます。cat
rev
ファイル全体をパイプするのを待ちません。これは、情報の最初の部分が到達する直前に開始されます。つまり、使用した記号に応じて、への接続が開かれfile.txt
ます。file.txt
file.txt
file.txt
ているので、新しい情報に備えてすべてを削除したので、それは機能して何も得られません。rev
cat
それで、なぜ上記を読んだ後に他の人が働くのですか?このため:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
ここでは、情報を別のファイルに送信しているcatにパイプしています。この場合、処理された入力ファイルfile.txt
は出力ファイルと同じではありませんfile2.txt
。その後、文字通り全体file2.txt
をfile.txt
で上書きしているため、によって行われたすべてのプロセスcat
が削除されました。基本的に行全体を単純化することができます。cp file.txt file2.txt
これはfile2.txt
、最後にが失わrev
れ、mv
コマンドで上書きされるため、同じことをしているためです。
rev file.txt | cat >> file.txt
この場合、同じファイルに情報を連結しています。したがって、それはそのファイルへの接続を開くだけで、単一の>で見られるような情報は消去しません。最終結果は、元の情報と逆の情報になります。
rev file.txt | cat --bogus-option > file.txt
では猫がファイルを開こうとしない場合でも、ファイルが切り捨てられます。
moreutils
)にはsponge
、入力ファイルを上書きするユースケース用に特別に設計されたツールが含まれています。たとえば、rev file.txt >file2.txt && mv file2.txt file.txt
回避策はになりますrev file.txt | sponge file.txt
。これは、名前がすでにある場合でも正しく機能しfile2.txt
ます。
シェルはリダイレクトを検出すると、関連するコマンドを実行する前に、まず関連ファイルを開きます。したがって、あなたがするとき:
foo file.txt | bar > file.txt
へのリダイレクトfile.txt
により、実行前 に切り捨てられてfoo
読み取ることができますfile.txt
。余談ですが、これができない理由です。
sed 'blah' file.txt > file.txt
そして、なぜsed
インプレース編集オプションがあります。
最後に、次のことを行います。
.. | cat > file.txt
ある猫の無駄な使用は、あなたがから読み取るしようとしている場合は特にそう、file.txt
上の早いです。
ファイルを元の場所に戻す場合、ショートカットはありません。sed
またはawk
インプレース編集でトリックを使用できる場合があります。
>
出力を別の何かに送るリダイレクタ(オペレータ)です
(次のコマンドの入力、プリンタなど)。
あなたの場合、出力はファイルfile.txt
に送られます。このファイルがすでに存在する場合は、作成されない場合は上書きされます。
>>
追加演算子です。file.txt
既に存在する場合、出力はファイルの最後に追加されます。ファイルが存在しない場合は作成され、出力は>
(リダイレクター)と同じように新しいファイルに書き込まれます。
>
and >>
演算子の両側にあることに起因するようです。
VimはExモードで使用できます。
ex -sc '%!rev' -cx file.txt
%
すべての行を選択
!
コマンドを実行する
x
保存して閉じます
cat
ますrev file.txt > file2.txt && mv file2.txt file.txt
。これはの余分な使用法ですcat
。それを省略することで、余分なプロセスを生成する余裕ができます。