Cách kiểm tra từ bash nếu gói tồn tại trong Debian


12

Tôi muốn viết một tập lệnh bash cài đặt, nơi tôi muốn cài đặt máy chủ MySQL.

Trên Linux Mint tôi đã theo mã:

apt-get -y --force-yes install mysql-server-5.6

nhưng tôi đã cài đặt Debian 8 mới và không có mysql-server- thay vào đó là có mariadb.

Làm thế nào tôi có thể tìm ra nếu gói tồn tại?

Tôi chỉ biết rằng có dpkg -smột gói nên được cài đặt hay không.


3
--force-yeshủy kích hoạt tất cả bảo mật, do đó bạn thực sự có thể phá vỡ hệ thống của mình đến mức không thể sửa chữa. Ngoài ra: --force-yesghi đè (hủy kích hoạt) -y. trong đó cái sau có thể là lựa chọn của sự lựa chọn: Một dạng dài -y--assume-yes, và đó là những gì nó làm; Nói có cho đến khi nó có thể trở nên thực sự xấu xí, với nguy cơ tàn phá giữa các yếu tố cốt lõi, nguyên tắc cơ bản, v.v. --forceghi đè phá vỡ an ninh (học theo cách khó khăn)
erch

Phụ lục: Bạn có thể quan tâm đến --simulatetùy chọn apt-get, để thực hiện --dry-run, chỉ trong trường hợp
erch

1
chỉ cần làm rõ: bạn muốn tìm hiểu xem một gói nằm trong bất kỳ kho lưu trữ nào được xác định trong /etc/apt/sources.list, phải không?
wullxz

Lưu ý rằng có thực sự là một gói mysql-server trong Debian 8, cùng với mariadb: packages.debian.org/jessie/mysql-server
Dan Getz

Câu trả lời:


13

(bên dưới là từ Ubuntu, nhưng kỹ thuật tương tự rõ ràng cũng hoạt động trên Debian)

$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Axel Beckert <abe@debian.org>
Architecture: amd64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_amd64.deb
Size: 645730
...

Nếu gói tồn tại, thông tin sẽ được hiển thị. Nếu không, bạn sẽ thấy một cái gì đó như:

$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found

Ngoài ra, mã thoát apt-cachesẽ khác không nếu không tìm thấy gói phù hợp.

Lưu ý bổ sung: Nếu bạn đang sử dụng apt-cache show packagegói ở đâu là gói ảo (một gói không tồn tại, nhưng, ví dụ, được tham chiếu bởi các gói khác), bạn sẽ nhận được:

N: Can't select versions from package 'package' as it is purely virtual
N: No packages found

Điều exit codenày là không (theo quan điểm của tôi là một chút sai lầm.)


3
chỉ để hoàn thành câu trả lời này: bạn cũng có thể tìm kiếm các kho lưu trữ được xác định từ sources.listlệnh này : apt-cache search *searchstring*. Lệnh đó cũng sẽ tìm kiếm mô tả các gói và có thể giúp bạn tìm các gói mà bạn không biết tên gói chính xác.
wullxz

1
@wullxz, chỉ apt-cache search ...trả về bất kỳ loại kết hợp và ứng dụng. trả về 0 ngay cả khi không tìm thấy gì, điều này không thực tế trong tập lệnh bash.
Alexis Wilke

4

Tôi sẽ sử dụng dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Nó sẽ kiểm tra xem mysql-servergói đã được cài đặt chưa và nếu vậy, nó sẽ in thực tế này ra màn hình. Một giải pháp phức tạp hơn sẽ là, trong bash (chưa được kiểm tra):

function package_exists() {
    return dpkg -l "$1" &> /dev/null
}

Vì vậy, người ta có thể làm trong một kịch bản:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi

5
Tôi nghĩ rằng anh ta muốn biết liệu gói đó có tồn tại hay không và nó đã được cài đặt trên máy cục bộ chưa ...
wullxz

0

Trong một lớp lót:

apt-cache pkgnames | grep -q "\<$your_package_name\>"

thoát bằng 0 nếu có, 1 nếu không.

Phần thưởng: kiểm tra hiệu quả cho nhiều gói, được liệt kê trong tệp "gói_we_want", mỗi gói trên một dòng, được sắp xếp với sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantliệt kê tất cả các gói mà bạn muốn, nhưng không tồn tại trong kho.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want liệt kê tất cả các gói mà bạn muốn và tồn tại trong kho.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.