Phát hiện xem gói homebrew đã được cài đặt chưa


104

Tôi sắp viết một tập lệnh shell để phát hiện xem một số gói homebrew đã được cài đặt trong hệ thống hay chưa. Có cách nào để sử dụng lệnh brew để đạt được điều đó không?

Tôi đã thử sử dụng mã thoát của brew install <formula> --dry-run. Nhưng điều này sẽ xây dựng gói nếu nó bị thiếu.


brew --cellar "$formula" >/dev/null 2>&1 --cellar formula: Display the location in the cellar where formula would be installed, without any sort of versioned directory as the last path. trang man bia ; sẽ thích để cho nó như một câu trả lời
166_MMX

if [ ! -x "$(command -v PKG_EXEC)" ]; then # package not installed fi
JBallin

Câu trả lời:


164

Bạn có thể dùng

brew ls --versions myformula

để xuất các phiên bản đã cài đặt của công thức tương ứng. Nếu công thức không được cài đặt, đầu ra sẽ trống.

Khi sử dụng phiên bản homebrew gần đây mà bạn có thể sử dụng brew update, bạn chỉ cần chạy nó (cảm ơn Slaven):

if brew ls --versions myformula > /dev/null; then
  # The package is installed
else
  # The package is not installed
fi

Điều đó nói rằng, có lẽ là một ý tưởng hay để kiểm tra sự tồn tại của công cụ chứ không chỉ kiểm tra gói homebrew tương ứng (ví dụ: bằng cách tìm kiếm tệp thực thi trong $PATH). Mọi người có xu hướng cài đặt các công cụ theo nhiều cách khá lớn trong thực tế, với homebrew chỉ là một trong số đó.


6
github.com/Homebrew/brew/commit/… nên kiểm tra mã thoát là đủ: nếu công thức chưa được cài đặt, thì trả về false (1).
Slaven Rezic,

Vì vậy, nếu tôi chạy if macchanger --help > /dev/null; then, sẽ kiểm tra xem đã macchangerđược cài đặt chưa?
ẩn danh

@KeeganKuhn Nếu điều đó thành công, thì đó macchangerlà trong trình bao hiện tại $PATH. Nếu nó không thành công, nó không có sẵn trong PATH hoặc không được cài đặt.
Holger Just

2
@Keegan Kuhn - Nếu bạn thực sự chỉ muốn kiểm tra xem một ứng dụng có trên PATH hay không (mà không cần chạy nó), bạn có thể sử dụng which -s. Các -stùy chọn (im lặng) là tài liệu như "-s Không đầu ra, chỉ cần trở về 0 nếu bất kỳ của các tập tin thực thi được tìm thấy, hoặc 1 nếu không được tìm thấy." Sử dụng hợp lý là một cái gì đó giống nhưwhich macchanger || echo "macchanger not on PATH"
Jeffrey Aguilera

7

Thế còn?

for pkg in macvim ngrep other needed packages; do
    if brew list -1 | grep -q "^${pkg}\$"; then
        echo "Package '$pkg' is installed"
    else
        echo "Package '$pkg' is not installed"
    fi
done

Các giải pháp của bạn không hoạt động với một số công thức được tạo phiên bản giống như công thức python@3được cài đặt (và được liệt kê) dưới dạng python3.
Daniele Orlando

1
# install if we haven't installed any version
brew ls --versions $lib || brew install $lib
# install if we haven't installed latest version
brew outdated $lib || brew install $lib

1

Hai lớp lót dễ dàng nhất: Bước một, đảm bảo rằng nó đã được cài đặt

$ realpath . || brew install coreutils

Điều này sẽ in ra đường dẫn thực của dir hiện tại, nếu không, thì nó sẽ cài đặt nó. Và nó sẽ không thất bại ngay cả khi không tìm thấy đường dẫn thực.

Bước hai, gọi nó trong mã thực của bạn:

$ realpath ${someDir}

Đây là một giải pháp dễ dàng cho một công cụ cụ thể. Nó không phải là một giải pháp chung chung.
iltempo
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.