Bash

我只能在使用 globbing 時使“rm”互動嗎?(在 bash 或 zsh 或兩者中)

  • March 5, 2022

每當我rm使用 shell globbing 一次處理多個項目時,即使模式擴展到超出我預期的最微小的可能性,我總是會嘗試記住添加-i,但是(當然)我可能會忘記並不小心吹走一些有用的東西。有些人試圖用別名來解決這個問題,例如alias rm='rm -i'但我討厭讓 rm始終互動的想法,因為那樣我就會養成一直使用的習慣-f,這顯然會破壞整個目的。

我想做的是rm-i在我使用 globbing 時使用,-f當然要覆蓋-i,所以我仍然可以用通常的rm -rf junk.

因此rm *blah*確實會rm -i *blah*,但rm blah會完全按照輸入的方式工作。

如果在不同的 shell 中實現這一點的方式存在差異,我將選擇一個為 bashzsh 提供方法的答案,而不是僅涵蓋其中一個的答案。


注意:我實際上並不認為這一定是個好主意;我只是問有沒有可能。如果您認為這是一個愚蠢的想法,我很高興聽到您的意見背後的原因,但請不要在答案欄位中發布此類評論。真正的答案要麼告訴我如何做到這一點,要麼解釋它/為什麼不可能(或者可能提供一種替代方法來獲得類似的結果)。但是,如果您想告訴我為什麼這是愚蠢的,請發表評論。即使我不同意這個結論,我也會贊成有充分理由的評論。

這並不容易。問題是當你這樣做時:

rm -- *.txt

rm 只看到文件列表,而不是 shell 已經擴展的 globbing 模式。

你可以做的是(zsh):

alias rm='noglob rm'

這告訴 zsh 在呼叫 rm 時不應擴展模式。然後,您可以將 rm 重新定義為執行擴展本身並在需要時添加“-i”的函式,例如:

'rm'() {
 [[ "$*" = *[*[?]* ]] && set -- -i "$@"
 command rm $~@
}

這種方法的問題在於,這個新的“rm”看不出兩者之間的區別

rm *

rm '*'

要刪除名為 的文件*,您必須編寫它:

rm [*]

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