編輯:請注意,如下所述,我知道此網站上的答案解釋了apt-get
使用正規表示式來解釋套件的名稱。事實上,問題直接在於其實際行為與記錄的行為不同的方式。請在建議重複之前先閱讀問題。
該網站上的一些答案警告有關使用apt-get
通配符(即星號*
:),因為apt-get
據說將它們擴展為正則表達式,這可能會產生意外(和不期望的)結果,尤其是使用apt-get remove
.的確,Ubuntuman
頁面apt-get
內容如下:
如果沒有套件與給定表達式匹配,且該表達式包含“.”、“?”之一或 '*' 則假定它是 POSIX 正規表示式,並且它應用於資料庫中的所有套件名稱。然後安裝(或刪除)所有符合項目。請注意,匹配是透過子字串完成的,因此“lo.*”匹配“how-lo”和“lowest”。如果不希望出現這種情況,請使用「^」或「$」字元錨定正規表示式,或建立更具體的正規表示式。
實際上,這個答案索賠:
apt-get 接受正規表示式而不是 glob 模式作為 shell。
我相信這是錯誤的(至少對 Xenial 來說)。例如,我可以重現以下行為:
$ sudo apt-get install -s 'meld*'
[...]
Note, selecting 'meld' for glob 'meld*'
[...]
$ sudo apt-get install -s 'meldt*'
[...]
Note, selecting 'python-meld3' for regex 'meldt*'
Note, selecting 'python3-meld3' for regex 'meldt*'
Note, selecting 'meld' for regex 'meldt*'
[...]
(我沒有刪除任何匹配項,只刪除了apt-get
回應中不相關的部分。)
在我看來,基於這種行為,apt-get
首先嘗試將給定表達式匹配為全域變量,並且只有在失敗時,才會將其作為正則表達式重試。
我有這個權利嗎?我是否誤解了該man
頁面,或者此行為是否有錯誤記錄?
答案1
這在apt(8)
線上說明頁:
install, remove, purge (apt-get(8))
Performs the requested action on one or more packages specified via
regex(7), glob(7) or exact match. The requested action can be
overridden for specific packages by append a plus (+) to the
package name to install this package or a minus (-) to remove it.
該段落不存在於15.10 線上說明頁,所以它可能是在 16.04 中添加的。
apt 的變更日誌中似乎沒有提到這一點 -2013 年新增此內容的提交手冊頁中沒有顯示任何變更。此功能被短暫停用並隨後重新啟用(請參閱2014 年 5 月至 2 月期間承諾), 和更改日誌中提到了禁用。
所以這可能是四年前添加的但是僅在 2015 年有記錄。 Andapt-get
的線上說明頁面仍被忽略。