我有一個腳本,它在我的底部插入一些行.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”。