ランニング:
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