`apt-get` 和通配符:glob 與正規表示式

`apt-get` 和通配符:glob 與正規表示式

編輯:請注意,如下所述,我知道此網站上的答案解釋了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的線上說明頁面仍被忽略。

相關內容