Contents

不留這次 Linux Bash 歷史記錄的方法

有時候在 Linux 主機上測試指令,會一直試錯、重跑、改參數,最後 history 裡面塞滿一堆沒價值的紀錄。尤其在維運主機、跳板機或共用環境上,這種暫時性的測試指令常常不想留下來,之後自己用 Ctrl+R 搜尋也會被雜訊洗掉。

這篇整理幾個我實際有測過的方法,目標很單純:只避免「這次 session」的 Bash 指令被寫回歷史檔,不去碰既有的舊紀錄。

先理解 Bash history 怎麼運作

Bash 的指令歷史通常會分成兩層:

  1. 目前 shell session 裡的記憶體紀錄。
  2. 登出時才寫回的 history 檔案,常見是 ~/.bash_history

所以很多人會以為「剛剛 history 還看得到,表示一定寫到磁碟了」,其實不一定。很多情況只是暫存在當前 shell 的記憶體,等 shell 結束時才同步回檔案。

常見幾個變數:

  • HISTFILE:history 寫回哪個檔案。
  • HISTSIZE:目前 shell 最多保留幾筆歷史。
  • HISTFILESIZE:history 檔案最多保留幾筆。
  • HISTCONTROL:控制哪些指令不要被記錄。

先看一下目前設定:

1
2
3
4
echo "$HISTFILE"
echo "$HISTSIZE"
echo "$HISTCONTROL"
history | tail

只不保留這次 session 的 3 種方式

方法 1:取消 HISTFILE

1
unset HISTFILE

這個做法的意思是把 history 寫回目標拿掉。當你登出 shell 時,就沒有地方可以寫,所以本次 session 的紀錄不會落到 ~/.bash_history

適合情境:

  • 你已經登入主機了,臨時想讓後續操作不落地。
  • 不想改太多設定,做完事情就離開。

要注意的是,當前 shell 內仍然可能看得到剛剛打過的指令,只是結束 session 後不會寫回檔案。

方法 2:把 HISTSIZE 設成 0

1
HISTSIZE=0

這個做法是直接讓目前 shell 幾乎不保留歷史。實務上我測起來,比較像是「本次 session 不再累積可查詢的 history」,登出後也通常不會把這次內容更新回去。

適合情境:

  • 想連當前 session 的 history 輸出都盡量變乾淨。
  • 在一段測試期間內,不希望繼續累積新紀錄。

不過不同發行版、不同 Bash 設定可能會有些微差異,所以如果你很在意結果,建議在測試機先驗證一次。

方法 3:直接結束目前 Bash

1
kill -9 $$

$$ 代表目前 shell 的 PID,直接把這個 shell 殺掉,就不會走正常的 history 寫回流程。這個方法很直接,我自己臨時收尾時最常想到它。

但這招也最粗暴,因為它不是正常登出,而是強制中止目前 session。

適合情境:

  • 這個 shell 已經用完了。
  • 你非常確定不需要再做任何清理動作。

不適合情境:

  • 還有前景程序沒收尾。
  • 你有 trap、暫存檔清理或其他 shell 結束邏輯要跑。
注意 kill -9 的副作用
kill -9 $$ 很有效,但它是直接砍掉目前 shell。若你還有未完成的輸出、子程序、暫存檔處理或 SSH 連線中的收尾邏輯,請先確認影響再用。

如果是想刪掉全部歷史

如果需求不是「只不保留這次」,而是要把目前 history 全清掉,可以用:

1
2
history -c
history -w

說明如下:

  • history -c:清掉目前 shell 記憶體中的 history。
  • history -w:把目前狀態寫回 history 檔案。

這組比較接近「把檔案也一起洗掉」。在正式主機上操作前,最好先搞清楚公司有沒有稽核、錄製 shell session 或集中式命令紀錄,不要誤以為清掉 history 就等於完全不留痕。

另一個更溫和的方法:忽略特定指令

如果你不是整段操作都不想記錄,只是偶爾幾條指令不想留下來,可以研究 HISTCONTROL

例如:

1
export HISTCONTROL=ignorespace

設定後,前面有空白的指令不會被記錄:

1
2
 ls
 pwd

這種方式比直接關掉整個 history 更溫和,適合平常開發機或個人環境使用。

我自己的使用建議

如果只是臨時測試,我會這樣選:

  • 想簡單阻止寫回:unset HISTFILE
  • 想連本次查詢都盡量不要累積:HISTSIZE=0
  • 事情做完立刻離開目前 shell:kill -9 $$

如果是長期習慣調整,HISTCONTROL=ignorespace 其實更實用,因為它不會把整個 history 體驗弄壞,也比較不容易誤傷正常工作流程。

小結

Bash history 不是「打一條就立刻永遠寫死」,而是有 session 記憶體與 history 檔案兩個階段。理解這件事後,就比較容易判斷到底該改 HISTFILEHISTSIZE,還是直接結束 shell。

我自己最常用的是 unset HISTFILE,因為它夠直接,也比 kill -9 $$ 安全一點。真的只是短暫測試,不想把錯誤指令污染整份 history,這招很夠用。

參考來源: