
我在許多不同的機器上有帳戶,用於測試我貢獻的幾個庫。有些機器歸其他人所有(例如 GCC 編譯場),我想保持它們整潔。
我想設定一個.bash_logout
執行make clean
以下操作的腳本exit
如果我在一個特定的目錄中。目錄要求退出多個 SSH 會話。如果我在一個會話中建置/測試,我不希望單獨的會話註銷來清理工件。即,exit
從$HOME/libfoo
執行乾淨;而exit
從$HOME
沒有。
我了解基礎知識,但我不清楚它有多強大:
# $HOME/.bash_logout
if [ "$PWD" = "$HOME/libfoo" ]; then
make clean 1>/dev/null 2>&1
fi
$PWD
註銷時使用有問題嗎?還有其他我可能錯過的問題嗎?
答案1
您打算僅在登出時執行腳本嗎?
來自 man bash:
當登入 shell 退出時,bash 會從檔案 ~/.bash_logout(如果存在)中讀取並執行命令。
僅在登出 bash 登入 shell 時。
如果您打算在每次 shell 關閉時執行腳本,請使用 trap (請參閱 man bash):
trap /u1/myuser/on_exit_script.sh EXIT
將其新增至 .bashrc 或其他適合您的檔案。
另外,由於腳本將在退出時執行,因此 $PWD 將是退出時處於活動狀態的腳本,這可能與 shell 啟動時相同,也可能不同。如果您需要對退出時使用的 $PWD 執行某些操作,那麼是的,此測試:
if [ "$PWD" = "$HOME/libfoo" ]; then
應該管用。
答案2
我喜歡許多可移植且與 shell 無關的 shell 腳本,因此我更喜歡捕獲 EXIT 而不是使用 bash 特定的 .bash_logout 方法。對於真正獨立的解決方案,最好不必修改或建立 .bash_logout,也不必依賴在退出時執行的單獨腳本。當然,更糟的是修改或覆蓋“exit”命令本身在系統上執行的操作 - 該解決方案不應影響其他任何人!
因此,為了將對外部系統的影響降至最低,我的首選方法是每當我開始在系統上工作時就將自訂登入設定檔放置到位,並讓相同的設定檔自行清理以及它創建的任何幫助程式腳本或設定檔。然後我獲取該配置文件(使用“.”,它也在 ksh 下工作),它設置了我所有的別名等 - 但我不希望它在我完成後保留下來。
因此,我在腳本本身中創建一個 shell 函數“bye”來執行上述清理,並通過以下方式將其註冊為註銷時自動清理,無論是有意還是通過簡單的斷開連接:
trap bye EXIT
這確保了我不會留下醜陋的工作痕跡。它應該執行哪種具體清理取決於您,特定於目錄的“make clean”只是眾多可能性之一。一旦透過任何方式註銷,設定檔的所有痕跡(甚至包括清理功能)都會消失。
您可以更進一步 - 也許您希望在不同類型的系統上進行不同類型的清理,或者在某些系統上您根本不希望進行此類清理。您可以將開關建置到「bye」shell 函數中,或建立不同的開關「bye1」、「bye2」並根據某些測試(例如某個檔案的存在)註冊所需的開關。這就是我如何防止在我長期使用的系統上刪除我的自訂配置文件,我想在其中保留相同的配置文件。
答案3
我不知道如何透過bash_logout 來做到這一點,儘管你可以編寫一個名為exit 的小腳本,將其放入/usr/local/bin/ 中,並使用你在問題中放入的程式碼類型,這樣當您在控制台中輸入 exit 如果您位於特定目錄中,它會執行您想要的操作