Bash

在腳本中使用互動式的 shell 歷史擴展

  • February 23, 2019

我有以下 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變數,它不需要做。

預設情況下,bashshell 維護目前互動式 shell 會話的記憶體歷史記錄。此歷史記錄保存到$HISTFILEshell 會話退出時。當啟用命令行歷史記錄的新會話啟動時,將從該文件中讀取保存的歷史記錄(假設新 shell 使用相同的$HISTFILE值)。

您的腳本,除非它具有HISTFILE從其呼叫環境繼承的變數,否則最多只能訪問其自己會話的命令行歷史記錄,即腳本中的命令。如果HISTFILE已導出,但如果呼叫 shell$HISTFILE在執行腳本之前從未將其歷史記錄保存到,則無法獲取該父 shell 會話的記憶體歷史記錄,您最多只能訪問會議早已死去。

引用自:https://unix.stackexchange.com/questions/502526