Bash
在腳本中使用互動式的 shell 歷史擴展
我有以下 Bash 腳本
set -o histexpand set -o history pwd lc="!!"
當我在互動式外殼中執行它時,它會列印
/home/user lc="pwd"
我想
lc=pwd
通過使用歷史擴展來獲取互動式 shell 中使用的最後一個命令,而不是 get 。所以如果我跑echo foo; ./script
,我希望得到/home/user lc="echo foo"
我試圖
set -H
在腳本中,但它不起作用。
使用 shell 的歷史擴展來獲取在執行腳本之前在 shell 會話中執行的命令是不可行的,除非呼叫 shell 將其歷史保存到
$HISTFILE
每個執行的命令之後,bash
預設情況下不會這樣做,並導出HISTFILE
變數,它不需要做。預設情況下,
bash
shell 維護目前互動式 shell 會話的記憶體歷史記錄。此歷史記錄保存到$HISTFILE
shell 會話退出時。當啟用命令行歷史記錄的新會話啟動時,將從該文件中讀取保存的歷史記錄(假設新 shell 使用相同的$HISTFILE
值)。您的腳本,除非它具有
HISTFILE
從其呼叫環境繼承的變數,否則最多只能訪問其自己會話的命令行歷史記錄,即腳本中的命令。如果HISTFILE
已導出,但如果呼叫 shell$HISTFILE
在執行腳本之前從未將其歷史記錄保存到,則無法獲取該父 shell 會話的記憶體歷史記錄,您最多只能訪問會議早已死去。