20

bashスクリプト内からシンボリックリンクの対象を変更したいのですが。問題は、シンボリックリンクが非常に重要であり(/bin/shつまり、)、次のような方法で行うことです。

  1. 古いターゲットを削除するとすぐに新しいターゲットが使用可能になります。つまり、何かがターゲットの消失に気付く可能性はありません。
  2. 変更が途中で失敗する可能性はありません。つまり、シンボリックリンクが削除され、新しいシンボリックリンクがないユーザーが残ります。

2つの方法を考えました。プレーンを使用するln

ln -fs /bin/bash /bin/sh

または使用mv

ln -s /bin/bash /bin/sh.new
mv /bin/sh.new /bin/sh

どちらが私のニーズに合うでしょうか?それらの1つがシンボリックリンク自体ではなくシンボリックリンクターゲットを置き換えようとする可能性はありますか?

4

2 に答える 2

23

名前の変更(mv)は不可分操作です。新しいシンボリックリンクを作成することはできません(古いシンボリックリンクを削除し、新しいシンボリックリンクを作成します)。したがって、次を使用する必要がありますmv

$ ln -s new current_tmp && mv -Tf current_tmp current

これについて議論しているブログ投稿があります。また、何が起こるか心配な場合は、最初に重要ではないシンボリックリンクで試してみませんか?

于 2009-09-06T09:03:32.860 に答える
-1

ln -f(マニュアルページから)新しいシンボリックリンクを作成する前にシンボリックリンクのリンクを解除するように見えます。これは、これmvに適したオプションであることを意味します。

ただし、にリンクすることは強くお勧めません。多くのスクリプトは以下を使用します:/bin/shbash

#!/bin/sh

シェルが古典的なBourneシェルであると仮定して書かれています。これを代わりに実行すると、スクリプトが想定していることと実際にbash行っていることの間にあいまいな非互換性が簡単に生じる可能性があります。これらを追跡することはほぼ不可能です。shbash

于 2009-09-06T09:04:50.283 に答える