回答:
この場合、リダイレクトの両方の方法(>と>>)の間で把握する必要がある基本的なことは次のとおりです。
指し示された情報をリダイレクトして上書きします。これは、パイプ "|"を介して情報を受信しているときに発生します
指示された情報にリダイレクトして連結します。これは、パイプ "|"を介して情報を受信しているときに発生します
どちらの場合も、ファイルが存在しない場合は、代わりに作成されます。「>>」でのみ、同じファイルで再度実行すると情報が連結されます。">"を使用すると、最初の実行時に行ったすべてのことを単純に上書きします。
しかし、ここでは出力ファイルと同じ入力ファイルを使用する場合の取り決めがあります。その特定の場合、「>」を使用すると、出力ファイルが「上書き」するため、「入力」部分が解析する必要のある情報が削除されます。だから:
rev file.txt | cat > file.txt
「スローモーション解説」で実際に起こっているのは:
revの内容を反転file.txtしてパイプに送信する準備をしますrevがパイプに情報を送信している間、パイプはそれを直接にストリーミングしcatます。cat情報を受信している間、file.txt設定された情報に自動的に適用されます。catrevファイル全体をパイプするのを待ちません。これは、情報の最初の部分が到達する直前に開始されます。つまり、使用した記号に応じて、への接続が開かれfile.txtます。file.txtfile.txtfile.txtているので、新しい情報に備えてすべてを削除したので、それは機能して何も得られません。revcatそれで、なぜ上記を読んだ後に他の人が働くのですか?このため:
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。それを省略することで、余分なプロセスを生成する余裕ができます。