2011-05-13 62 views
2

我正在使用Perl編寫軟件包安裝程序腳本。我需要一個命令(可能是OS命令),如果安裝了Ubuntu/Debian軟件包,它將返回一個簡單的0或1給調用者腳本。軟件包管理器命令,在Ubuntu/Debian中返回0或1(如果安裝了軟件包)

我已經試過

 dpkg -s 

它總是返回0

 dpkg -L 

差不多的作品,但如果用戶沒有

 apt-get --purge remove 

包,某些文件被左,總是返回0

我不想grep文本 - 一個簡單的真或假是我需要的。 任何想法?

@Andy:

aptitude remove unixodbc -y 

    dpkg-query -W unixodbc; echo $? 
    unixodbc  2.2.11-21 
    0 

    aptitude install unixodbc -y 

    dpkg-query -W unixodbc; echo $? 
    unixodbc  2.2.11-21 
    0 
+0

但'grep'確實返回一個簡單的真或假。 – ikegami 2011-05-13 23:21:36

+0

@ikegami必須有簡單的包管理器命令返回0或1.如果我grep的文本發生變化,並且我的程序在世界中,我的所有程序都將失敗 - 這不是一個選項。 – bitbucket 2011-05-13 23:27:39

+0

包狀態記錄。如果他們改變了,那將違反他們的文件。 – ikegami 2011-05-13 23:31:58

回答

3

也許並不理想,但這個工程:

dpkg -s "$package" | grep '^Status:' | grep -q ' installed' 

或者只是

dpkg -s "$package" | grep -q '^Status:.* installed' 
+0

這不太優雅。 – bitbucket 2011-05-13 23:38:14

+2

@bitbucket有時你必須拒絕優雅而偏愛功能。 – CanSpice 2011-05-13 23:51:33

+0

@CanSpice這不是查詢包是否安裝的標準方法 - 必須有一個更簡單的方法。 – bitbucket 2011-05-13 23:55:05

0

如果你要使用的dpkg數據庫,我贊同「使用grep」的建議。考慮到封裝工具的輸出格式隨着替代解決方案的複雜性而變化的可能性,最好使用grep。

也就是說,這裏有一些可能性:

  1. 使用dpkg --get-selections。退出狀態始終爲零,但輸出非常簡單:<package><white space><status>。這是「請求的狀態」(安裝/保持/卸載/清除),它可能與實際的軟件包狀態不同,但通常不會。

  2. 使用在dctrl-toolsdpkg-awk

  3. 實施一個測試,直接決定的依賴是否存在,例如,使用pkg-config,或搜索PATH程序公用事業之一。這具有以下優點:它允許安裝在依賴性由手工構建且在不知道包管理器的情況下安裝的系統上繼續。這也使得你的安裝腳本更加便攜。

  4. 你可能想在看向PackageKit

1

我覺得這個做的:

test -n "`aptitude search '?name(^packagename$)~i'`" 

將無法​​在虛擬包工作。