更新 `.bashrc` 並重新加載

更新 `.bashrc` 並重新加載

我有一個腳本,它在我的底部插入一些行.bashrc,有沒有辦法.bashrc從腳本中獲取這些行,以便在腳本完成後保留這些更改?這是類似腳本的 MWE:

#!/bin/bash

echo "export MyDir='MyAnalysis'" >> ~/.bashrc
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc

source ~/.bashrc

運行腳本後,除非手動取得文件,否則MyDir都不llA可用.bashrc

答案1

不直接。

您的腳本在與互動式 shell 不同的進程中執行。當腳本的 shell 退出時,該腳本的 shell 對環境所做的任何變更都會消失。子進程不允許改變父進程的環境。

你可以做的事情:

  • 該腳本更新您的 .bashrc 且不執行任何其他操作:如果腳本成功完成,您將獲取 bashrc

    bash yourScript.bash && source .bashrc
    
  • 該腳本更新 .bashrc,並且印刷source 指令:確保它不會列印任何其他內容。然後你eval執行腳本。

    eval "$(bash yourScript.bash)"
    
  • 該腳本更新 .bashrc 和印製它的作用。你評估它:這是腳本

    #!/bin/bash
    exec > >(tee -a "$HOME/.bashrc")
    
    echo "export MyDir='MyAnalysis'"
    echo "alias llA='ll MyAnalysis'"
    

    你運行它就像

    eval "$(bash yourScript.bash)"
    
  • 不要更新家長shell,但啟動一個新的互動式 shell 來讀取 bashrc

    #!/bin/bash
    {
        echo "export MyDir='MyAnalysis'"
        echo "alias llA='ll MyAnalysis'"
    } >> ~/.bashrc
    exec bash -i
    

    父 shell 未更新。


如果您將 .bashrc 更新程式碼設為功能,它將按預期工作,因為函數在當前 shell 中運行(預設):

addMyAnalysis() {
    echo "export MyDir='MyAnalysis'" >> ~/.bashrc
    echo "alias llA='ll MyAnalysis'" >> ~/.bashrc
    source ~/.bashrc
}

另一種技術:建立一個「conf」目錄$HOME/.bash.d。在裡面寫入bash文件

# this is "~/.bash.d/some_file.bash"
export MyDir='MyAnalysis'
alias llA='ll MyAnalysis'

並且您的 .bashrc 會取得該目錄中的任何 bash 檔案:

if [[ -d ~/.bash.d ]]; then
    shopt -s nullglob
    for f in ~/.bash.d/*.bash; do
        source "$f"
    done
    shopt -u nullglob
fi

答案2

正如 @glenn-jackman 所指出的,您的採購發生在執行腳本的子 shell 中,並且在腳本結束時您返回到沒有發生採購的父 shell,並且 .bashrc 也不會重新執行 - 這種分離父shell和子shell 源自於一般安全考量。

您正在尋找的是exec bash,但不在您的腳本內,而是與其分組,即

bash your-script.sh && exec bash

這表現彷彿您將進行採購,然後留在您採購的外殼中。確實如此取代目前的 shell 附帶一個新的 shell,這個新的 shell 與每個(互動式)shell 一樣啟動,運行您的 .bashrc,現在進行您的更改,您啟動的每個新 shell/終端也是如此。

請注意,如果您在腳本中“exec bash”,它將取代腳本運行的子 shell,但仍然是子 shell。

如果您的目標是對 .bashrc 進行動態和臨時操作,您應該考慮 @glenn-jackman 的建議,即在單獨的檔案中進行更改,這些檔案可以在您選擇的任何時候輕鬆刪除。為此,您也可以擁有一條永久線路

[ -f ~/.bashrc-temporary-addons ] && source ~/.bashrc-temporary-addons

在 .bashrc 的末尾,然後執行 (! only第一行中的「">」有一個新檔案)

echo "" > ~/.bashrc-temporary-addons
echo "export MyDir='MyAnalysis'" >> ~/.bashrc-temporary-addons
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc-temporary-addons

並且,在您選擇的某個點上,只需

rm ~/.bashrc-temporary-addons

(由於“-f”測試,如果“~/.bashrc-temporary-addons”不存在,則不會出現錯誤)。

如果您的 .bashrc 操作應該與您的會話一樣長,即直到登出(但不會在下次登入時重新出現),那麼您可以建立一個.bash_logout檔案來刪除「bash.d/」中的臨時檔案或「bash .d/”中的所有內容。d/”或“~/.bashrc-temporary-addons”。

相關內容