2017-03-03 72 views
0

由於不完整的Ctrl-R搜索和rm -rf我無意中運行了錯誤的命令,因此我想到了一個文件。清理命令,然後將其存儲在bash歷史記錄中

有沒有方法可以將rm -rf foo作爲rm -r foo保存在bash歷史中?
這將確保命令是否在將來意外運行,它會在這樣做之前詢問。
rm化名爲rm -iv,所以我認爲這將停止rm -r從去除不問(我承認我沒有沒有-i標誌運行rm -r

的原因,我認爲這是可能是基於bash的爆炸建宏。

mkdir foo 
cd !$ 

將顯示在bash歷史:

mkdir foo 
cd foo 

編輯:雖然我欣賞「不保存歷史在所有」的解決方案,我意識到這一點,特別需要一個不同的解決方案,正如@tripleee所解釋的那樣。

+1

參見:http://unix.stackexchange.com/questions/32460/excluding-some-of-the-commands-from-being-getting-stored-in-bash-history的 – codeforester

+0

可能的複製[如何防止命令顯示在bash歷史?](http://stackoverflow.com/questions/6475524/how-to-prevent-commands-to-show-up-in-bash-history) – codeforester

+0

與你的別名, 'rm -rf'展開爲'rm -iv -rf',所以'-f'覆蓋了前面的'-i'。 – chepner

回答

3

我不知道這是多麼的安全,它可能會錯過某種提供-f選項的方式。這就是說,你可以重寫rm下列要求:

rm() { 
    local HISTIGNORE="$HISTIGNORE:command rm *" 
    local arg process 
    local -a sanitized 
    command rm "[email protected]" 
    process=true 
    for arg in "[email protected]"; do 
    if [[ $process && $arg = -*f* ]]; then 
     sanitized+=("${arg//f/}") 
    elif [[ $arg == -- ]]; then 
     process= 
    else 
     sanitized+=("$arg") 
    fi 
    done 
    history -s rm "${sanitized[@]}" 
} 

這種工作方式如下:

  1. 暫時模式command rm *添加到HISTIGNORE列表,以便將要執行的命令不添加到歷史記錄。
  2. 根據要求執行命令。
  3. 瀏覽參數,查找包含-f選項的任何參數。 (無論是獨立的還是一組短的選項。)任何這樣的單詞應刪除f。消毒的單詞被添加到新的數組中。
  4. history -s命令將重建的命令(帶清理參數)添加到歷史記錄列表中。
+0

這是解決這個問題的一個非常有趣的方法。由於我的別名,這在歷史上顯示爲'rm -iv -r foo',但它仍然非常出色。在刪除任何內容之前,重新運行該命令詢問我。謝謝。 –

相關問題