Tại sao đầu ra chính sách apt-cache không được cấp?


12

Không thể hiểu tại sao

$ apt-cache policy foo
N: Unable to locate package foo

nhưng

$ apt-cache policy foo 2>&1 | grep .

trống rỗng

Trường hợp trong cuộc gọi sau tôi đang làm giả định sai?

Nhiệm vụ ban đầu: Tôi cần xử lý apt-cache policyđầu ra có lẽ :-)

CẬP NHẬT :

foođược sử dụng trong ví dụ của tôi có thể được thay thế bằng bất kỳ tên gói nào không tồn tại trong apt-getchỉ mục của bạn .

CẬP NHẬT 2 :

có một câu trả lời với một cách giải quyết. Tiền +50thưởng bổ sung sẽ được trao cho bất cứ ai giải thích lý do tại sao 2>&1giải pháp không hoạt động.


# apt-cache policy vim 2>&1 |grep . vim: Installed: 2:7.4.712-2 Candidate: 2:7.4.712-2 Version table: *** 2:7.4.712-2 0 500 http://ftp.debian.org/debian/ sid/main amd64 Packages 100 /var/lib/dpkg/status
Tiếng Ba Tư

1
@MohsenPahlevanzadeh đúng vậy, bây giờ hãy thử cuộc gọi chính xác (tên gói) tôi đã cung cấp :-)
zerkms

3
@MohsenPahlevanzadeh vậy? Tôi xin lỗi, nhưng bạn có chắc là bạn đã đọc câu hỏi (và tiêu đề) không?
zerkms

2
@MohsenPahlevanzadeh không bằng (thậm chí không gần)
zerkms

1
Tôi chạy strace apt-cache policy foo 2>&1và có một cuộc gọi hệ thống ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0tôi nghĩ vì cuộc gọi 1 (stdout) này có vấn đề. Ý tôi là nó không được viết cho tty nữa
Esref

Câu trả lời:


11

Nếu thiết bị xuất chuẩn không phải là một tty (nghĩa là tệp thông thường hoặc đường ống) và nếu không có --quiettùy chọn nào được chỉ định, hãy apt-cachehành động như thể bạn đã vượt qua nó --quiet=1. Một cách giải quyết là để vượt qua nó một --quiet=0tùy chọn.

$ apt-cache --quiet=0 policy foo 2>&1 | grep .
N: Unable to locate package foo

|&chơi gôn 2>&1 |:-)
Ciro Santilli 改造 心 心 事件

10

Dường như có một số hành vi gian lận để chuyển hướng trong apt-cache. Nhưng chúng ta có thể lừa một kẻ lừa đảo bằng cách hoán đổi stdout và stderr !

Hãy thử cái này, nó sẽ hoạt động:

apt-cache policy foo 3>&1 1>&2 2>&3 3>&- | grep .

7

Nếu bạn chạy strace apt-cache policy foo 2>&1lệnh, bạn có thể thấy dòngioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

Bởi vì lệnh đó thao túng 1 (thiết bị xuất chuẩn), 1 không được ghi vào thiết bị xuất chuẩn nữa. Và nếu bạn chuyển hướng 2 đến 1, bạn đã mất cả hai.

Chỉnh sửa: Đây là một số mẫu mã từ mã nguồn apt-cache:

// Deal with stdout not being a tty
   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
      _config->Set("quiet","1");

Được chứ. Có cách nào để bắt cả hai không?
zerkms

1
Tôi không thể tìm thấy bất kỳ cách nào khác ngoài câu trả lời của @ Mr_Mig. (Của tôi là vậy apt-cache policy foo 1>&2 2>&1 | grep .) 1) _config-> Đặt ("yên lặng", "1");
Esref

Btw, tôi cũng đã được ai đó chỉ ra cùng một điểm trong các nguồn chỉ vài phút trước :-) Và một giải pháp tiềm năng tốt hơn script -c "sudo apt-cache policy foo" | grep Unableđòi hỏi phải cài đặt scriptmặc dù. Theo lời khuyên - Tôi sẽ đặt +50 ở đây trong 2 ngày (SE không cho phép thực hiện sớm hơn)
zerkms

2
@Esref Nhận xét của bạn về "Tôi thấy rằng trong mã nguồn apt apt-cache ..." nên có trong câu trả lời, vì vậy vui lòng thêm nó vào đó. +1. :
Faheem Mitha

Trời ơi, không còn tùy chọn tiền thưởng +50 nữa :-(
zerkms

3

Một giải pháp "tốt hơn" sẽ là sử dụng một scripttiện ích:

script -c "apt-cache policy foo" /dev/null | grep .

Bằng cách đó, nó chặn tất cả đầu ra và chuyển tiếp nó tới stdout.

Hạn chế duy nhất là bạn cần cài đặt scriptnếu bạn chưa có. Trong ubunty nó được cung cấp bởi bsdutilsgói.

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.