コマンドを実行すると:
猫 < フー > フー
fooはatribaryファイルなので、 catコマンドの入力と出力をfooにしているので、foo は変わらないと思いました。しかし、このコマンドはfooを消去することが判明しました。それ以外の場合、入力をバーにリダイレクトすると
cat < foo > バー
次に、 barはfooのコピーです。私はそれを理解できない理由は何ですか?ここで何が欠けていますか?
コマンドを実行すると:
猫 < フー > フー
fooはatribaryファイルなので、 catコマンドの入力と出力をfooにしているので、foo は変わらないと思いました。しかし、このコマンドはfooを消去することが判明しました。それ以外の場合、入力をバーにリダイレクトすると
cat < foo > バー
次に、 barはfooのコピーです。私はそれを理解できない理由は何ですか?ここで何が欠けていますか?
ファイルへの出力のリダイレクトは、コマンドを実行するシェルによって行われ、ファイルの内容が完全に消去されます。これは、まさに最初のコマンドで表示されるものです。2 番目のコマンドは、新しいファイルを作成bar
(または上書き) します。
シェルは何をするかを知りませんし、気にもしませんcat
。それが知っているのは、実行cat
して、あるファイルからの入力を読み取らせ、別のファイルにリダイレクトさせることだけです。
ファイルの内容をコマンドの出力に置き換えたい場合foo
、最も移植性の高い方法は一時ファイルを使用することです。以下はそのスケルトンです。
tmpfile=..... # temporary name - see mktemp for portable secure ways to create it!
cat < foo > $tmpfile
mv $tmpfile foo