我正在編寫一個 bash 腳本,它將現有目錄移至新名稱,使用舊名稱建立新目錄,然後變更為新建立的目錄。奇怪的是,新目錄不是空的,而是包含舊目錄(現在已重新命名)中的所有內容。但移動是成功的,重命名的目錄存在並且包含它應包含的內容。如果我比較 inode,我仍然在重命名的目錄中,但是用“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$
Inode 20578307 是重新命名的目錄,20578306 是新目錄。我嘗試在腳本的各個位置插入“同步”,但沒有任何運氣。如果在腳本運行後在命令列上手動上升一級然後返回,一切都會恢復正常,並且我會看到正確的索引節點號。
知道要嘗試什麼嗎?如何解決?是什麼原因?或甚至有真正的解決方案?我對它發生的原因感興趣,就像對實現我所需的工作方式感興趣一樣。
答案1
您從未更改過目錄,直到...
如果在腳本運行後在命令列上手動上升一級然後返回,一切都會恢復正常。
您無法透過以通常的方式執行另一個腳本來變更終端的目前目錄。這是因為腳本是在子 shell 中執行的,這對父 shell 的環境(即終端會話)沒有影響。
你需要來源你的腳本為:
source script
也可以縮寫為:
. script
在同一個 shell 中運行它。