為什麼命令歷史記錄只在退出時保存

為什麼命令歷史記錄只在退出時保存

我試圖為每個選項卡/終端機保存不同的歷史文件,但我無法在命令運行後立即保存它。當我運行“退出”時,歷史記錄才會被保存。

這是一個問題,因為我想要實現的是擁有歷史記錄的副本,以防終端機或電腦崩潰。

瀏覽網路後,這就是我的 .bashrc 檔案中的內容:

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

知道我做錯了什麼嗎?

謝謝。

答案1

您指派的 PROMPT_COMMAND 不正確。當你寫的時候

PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

您正在執行「history -a」(不產生任何輸出),然後執行 $ROMPT_COMMAND(在啟動腳本期間可能為空),並將這兩個命令的輸出(空字串)指派給 PROMPT_COMMAND。你想要的只是:

PROMPT_COMMAND='history -a'

如果要將其附加到目前現有的命令,請執行

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"

答案2

由於某種我無法理解的原因,這有效:

export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"

雖然這並不

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

當然,第一個解決方案比理論上好的解決方案(第二個)慢,因為每次寫入新命令時都會保存整個歷史記錄。

因此,如果有人知道為什麼會出現這種情況以及如何解決這個問題,我將非常感激。

答案3

回答意圖,而不是字面問題:

看看使用腳本。這將為您提供命令及其輸出。請注意,這不是萬能藥,因為任何使用遊標定位的命令以後都很難破解。

命名腳本 - 製作終端機會話的打字稿

概要腳本 [-a] [-c 指令] [-f] [-q] [-t] [檔]

描述腳本將終端機上列印的所有內容製作為打字稿。對於需要互動式會話的硬拷貝記錄作為作業證明的學生來說,它非常有用,因為稍後可以使用 lpr(1) 列印打字稿文件。

如果給予參數文件,腳本會將所有對話保存在文件中。如果未給出檔案名,則打字稿將保存在文件打字稿中。

選項:

  -a'        Append the output to file or typescript, retaining the priorcontents.

-c COMMAND 運行 COMMAND 而不是互動式 shell。這使得腳本可以輕鬆捕捉當標準輸出不是 tty 時表現不同的程式的輸出。 -f' 每次寫入後都會刷新輸出。這對遠端合作很有好處:一個人可以執行「mkfifo foo;」操作。 script -f foo' 和另一個腳本可以使用 'cat foo' 即時監控正在執行的操作。

-q' 安靜。

-t' 將計時資料輸出到標準誤差。該資料包含兩個字段,以空格分隔。第一個欄位指示自上次輸出以來經過了多少時間。第二個字段表示這次輸出了多少個字元。此資訊可用於重播具有真實打字和輸出延遲的打字稿。

當分叉 shell 退出時(使用 control-D 退出 Bourne shell (sh(1)),以及退出、登出或 control-d(如果未設定ignoreeof)C-shell csh(1),腳本結束)。

某些互動式指令(例如 vi(1))會在打字稿檔案中建立垃圾。腳本最適合不操作螢幕的命令,結果旨在模擬硬拷貝終端。 …

在Google上搜尋「man script」。如果您有特定的作業系統,請包含該作業系統。這是 Linux 版本,但 *BSD、Mac 也有接近相同的版本。也許 Windows 連接埠也在那裡。

相關內容