Linux
bash:帶有歷史 -d 的函式不會刪除歷史條目
看了一些文章,想不通怎麼進來
history -d 1
的一個函式不刪除條目。下面的函式直接進入命令行:
function test () { echo "HISTFILE: '${HISTFILE}'" history -d 1 }
然後我們執行:
history -c echo "to remove" history 1 echo "to remove" 2 history echo $(test) HISTFILE: '/home/user/.bash_history' history 1 echo "to remove" 2 history 3 echo $(test) 4 history
關於它如何不刪除歷史的第一個條目的任何想法?
該函式(順便說一句,它重載了標準實用程序的名稱,因此您可能應該更改它)正在命令替換(一個單獨的子shell)中執行。
在子shell 中,它刪除了第一個歷史記錄條目。但是,它不會影響呼叫 shell 的歷史。
首先,將函式重命名為除此之外的其他名稱
test
(這不會修復錯誤,但test
已經是標準實用程序),然後停止使用echo $(some-command)
以輸出命令或函式的輸出。這是一個有幾個問題的反模式。直接使用函式名即可;它已經在做自己的輸出了。除了
echo
不需要命令替換之外,echo
如果輸出包含反斜杠,則可能會更改命令輸出。不帶引號的命令替換還會導致 shell 將命令輸出拆分為空格、製表符和換行符( 中的任何字元$IFS
),並將文件名萬用字元應用於拆分的單詞。然後,該echo
實用程序將在一行上輸出所有生成的單詞,它們之間有空格。有關的:
- 什麼時候需要雙引號?
- 為什麼 printf 比 echo 好?(與 的問題有關
echo
,但我絕對不是說您應該printf
在這種情況下使用!)