パイプを使用してファイルに追加すると、追加されませんが上書きされます。

パイプを使用してファイルに追加すると、追加されませんが上書きされます。

ランニング:

cat .bashrc | sed s/HISTFILESIZE=.*/HISTFILESIZE=10000/ >> .bashrc | echo 'HISTTIMEFORMAT="%F %T "' >> .bashrc

.bashrcが繰り返されると予想されます(>>ディレクティブを使用)。

ただし、重複はありません。説明は何ですか?

ベストアンサー1

.bashrcが繰り返されると予想されます(>>ディレクティブを使用)。

ファイルの内容をコピーする必要があります。はい。catファイルの内容はsedすべて印刷され、そのまま渡され、追加されたリダイレクトによって印刷された内容がファイルの末尾に到達することが保証されるため、読んでいる部分と書き込む部分が部分的に重ならないようにします。

$ cat test.txt
hello
world
$ cat test.txt
hello
world
new line
hello
world
new line

コンテンツをコピーしても.bashrc役に立ちません。また、タイミングがどのように機能するかに応じてcat、新しく作成されたレプリカが再度読み取られる可能性があります。これは何よりもファイルサイズによって異なります。小さいファイルはcat内容全体を読み、さらに書き込む前にEOFを見る可能性が高いからです。

パイプ... >> file | echo ...は少し面白いです。これは、左側のリダイレクトが両方のコマンドを接続するパイプを上書きし、echoとにかく入力を読み取らないためです。パイプラインの各部分が同時に開始されるため、echo左側の出力が実行前か後であるかがわからないという追加の問題があります。

これでzshを使用すると状況が変わります。 setを通してzshはプロセスmultiosの出力をソートします。sed両方パイプとファイルに。ただし、echoパイプから何も読み取られないため(迅速に完了することができる)、zshのヘルパープロセスがパイプに書き込むとSIGPIPE信号で終了し、ファイルに書き込まれません。次の内容が表示されますseq 10 > foo.txt | true。これは私に空のファイルを与えました。

だから... >> file; echo ...代わりにそれを使用してください。

ファイルの一部を変更したい場合はsed -i便利です。だから:

sed -i 's/HISTFILESIZE=.*/HISTFILESIZE=10000/' .bashrc
echo 'HISTTIMEFORMAT="%F %T "' >> .bashrc

おすすめ記事