私は、既存のディレクトリを新しい名前に移動し、古い名前で新しいディレクトリを作成し、その新しく作成したディレクトリに変更する bash スクリプトを作成しています。奇妙なことに、新しいディレクトリは空ではなく、名前が変更された古いディレクトリのすべてが含まれています。しかし、移動は成功し、名前が変更されたディレクトリが存在し、そこに含まれるべきものが含まれています。また、i ノードを比較すると、名前が変更されたディレクトリにまだいますが、「pwd」で示された名前は、新しいディレクトリにいるはずであることを示しています。
より明確にするために、バックアップを作成するディレクトリから始めます。スクリプトは基本的に次のことを行います。
cd <away>
mv <olddir> <olddir>~
mkdir <olddir>
cd <olddir>
私はフルパス名を使用しています。pushd/popd を使用しても同じ結果になります。結果は非常に奇妙です (test9 は、期待されるディレクトリにいるかどうかを簡単に確認するために作成した空のファイルです)。
/opt/camera_pkg_sdk$ ls -ia1
20578307 .
20447233 ..
20578305 test9
/opt/camera_pkg_sdk$ ls -ia1 ../camera_pkg_sdk
20578306 .
20447233 ..
/opt/camera_pkg_sdk$
i ノード 20578307 は名前が変更されたディレクトリで、20578306 は新しいディレクトリです。スクリプト内のさまざまな場所に 'sync' を挿入してみましたが、うまくいきませんでした。スクリプトの実行後にコマンド ラインで手動で 1 レベル上に移動してから戻ると、すべてが正常に戻り、正しい i ノード番号が表示されます。
何を試せばよいか、何かアイデアはありますか? 回避策はありますか? 原因は何ですか? あるいは、本当の解決策はありますか? 私は、必要なことを達成するための実用的な方法と同じくらい、なぜそれが起こるのかということに興味があります。
答え1
これまでディレクトリを変更したことがありませんでした...
スクリプトの実行後にコマンド ラインで手動で 1 レベル上に移動してから戻ると、すべてが正常に戻ります。
通常の方法で別のスクリプトを実行しても、ターミナルの現在のディレクトリを変更することはできません。これは、スクリプトがサブシェルで実行され、親シェル、つまりターミナル セッションの環境に影響を与えないためです。
必要があるソーススクリプトを次のようにします:
source script
これは次のように省略することもできます。
. script
同じシェル内で実行します。