
sd/common.py -> actual_file
生成されたファイルに置き換えるシンボリックリンクがあります。
しかし、そのたびに
cp /tmp/Star_Wrangler/common.py sd/common.py
...私が望むようにシンボリックリンクを置き換えるのではなく、コピーして/tmp/Star_Wrangler/common.py
上書きします。actual_file
コピーする前にシンボリックリンクを削除することを忘れるたびに、これが発生します。
私が期待する動作を得るためのオプションはありますか?マニュアルを見ましたが、すべてのターゲットへのシンボリックリンクではなく、ソースへのシンボリックリンクについて話します。
答え1
どのUnixを使用しているかによって異なります。
cp -f
一部のBSDシステム(OpenBSD、FreeBSD)では、シンボリックリンクのリンクを解放(削除)してソースコードに置き換えることがわかります。
GNUではcp
同じ効果がないため、longオプションを使用する必要があります--remove-destination
。
macOSでは、cp -c
マニュアルの説明に従って「ファイルのコピー」を使用してくださいclonefile(2)
。
NetBSDではcp -a
(「アーカイブモード」、このシステムと同じcp -RpP
)を使用してください。すべてのシステムに同じまたは類似の-a
オプションがありますが、GNU、macOS、OpenBSD、またはFreeBSDでは機能しませんcp
(GNUシステムでは同じ-dR --preserve
)。
あなたはこれに直接言及しました:ファイルをコピーする前にリンクを削除すると問題が解決します。このrm
ユーティリティは、リンクが参照するファイルではなくリンクを削除します。これは、シンボリックリンクを通常のファイルに置き換える最も移植可能な方法でもあります。
スクリプトを書くrm
ときcp
。
インタラクティブな作業中にこの作業を忘れ続けると、cp
この状況に特定のオプションを使用することも忘れられます。
答え2
シンボリックリンクの動作は、シンボリックリンクだけでなく、組み込みcp
関数(または対応するエイリアス)chmod
に対しても非常に混乱します。chown
test
[ .. ]
まず、シンボリックリンクを削除します。(rm -f sd/common.py
)、次にcp
。
もちろん、システムごとにバージョンごとにcp
これを行うオプションは異なりますが、気をつけやすいです。
あなたができるもう一つのことは、cp
シンボリックリンクの結果を避け、目標にすることです。ln -sf SOURCE DESTINATION
(両方のパラメータは絶対パスです。)混乱を招くことなく、すべてのPOSIXシステムで動作します。-f
既存のDESTINATION
ファイル/シンボリックリンクを削除します(ああ、ディレクトリを除く)。realpath
これを相対/絶対パス問題の防止と組み合わせることができます。
ln -sf "$(realpath "$SOURCE")" "$(realpath "$DESTINATION")"