私は最近、私のbashスクリプトの誤動作に少し気づき、疑問に思っていました。
本質的に、問題はこれに要約されます。最初に、次のレイアウトの既存のディレクトリ構造がありました。
/opt/dir/file.a
/opt/dir/file.b
/opt/dir/file
ここで、file
はハードリンクからfile.a
へです。 file
を、パラメーターに応じてfile.a
またはfile.b
を選択するシェルスクリプトに置き換えたかったので、次のように実行しました。
cp my_file /opt/dir/file
問題は、file
がfile.a
へのハードリンクであるため(つまり、2つのファイルは実際には同じiノードの2つの名前にすぎない)、変更がfile
とfile.a
の両方に反映されていることです。これは明らかに私が望んでいたものではありませんでした。
cp
コマンドは、fopen("file", "w+")
のような切り捨てファイルフラグを使用して/opt/dir/file
を効果的に開いたようです。それに書いた。 newファイルをその名前にコピーしていたので、ハードリンクが壊れることを期待していました。
これはcp
の正しく予想される動作ですか?それは私には直感的ではないようです。ある場所から別の場所にファイルをコピーするとき、私はそれを書き直すのではなく、置き換えることを心に留めています。これを回避するためのcp
のフラグはありますか?私の現在の回避策は、私がrm /opt/dir/file && cp my_file /opt/dir/file
することです。
マニュアルページを見ると表示cp --remove-destination my_file /opt/dir/file
が正しい解決策かもしれませんが、それでも私は誰もがこの件について何を言わなければならないかに興味があります。
あなたが説明しているのは、バグではなく、cp
の正しい動作です。探している結果を考えると、スクリプトに加えた変更(rm
の後にcp
が続く)は正しいアプローチのように思えます。