`dpkg --contents`가 SIGPIPE를 처리할 수 없습니까?

`dpkg --contents`가 SIGPIPE를 처리할 수 없습니까?

제가 인수한 일부 CI 스크립트에서 이상한 안티 패턴을 발견했습니다. 이는 기본적으로 다음 코드로 요약됩니다. 특정 파일이 패키지에 존재하는지 확인합니다.

dpkg --contents some.deb > contents.txt
grep --quiet foo contents.txt

확실한 리팩토링을 시도했지만 dpkg --contents some.deb | grep --quiet foo다음 오류가 계속 발생합니다.

dpkg-deb: 오류: 신호에 의해 tar 하위 프로세스가 종료됨(깨진 파이프)

추가 조사를 통해 확실히 시간 문제였습니다. 일치하는 정규 표현식을 사용하는 경우일찍입력 스트림에서 오류가 발생하지만 이후 줄과 구체적으로 일치하는 정규식을 사용하면 성공합니다.

가장 분명한 결론은 SIGPIPE에 문제가 있거나 잘못 dpkg되었을 수 있다는 것입니다. tar이것이 알려진 문제입니까?

플랫폼:

# lsb_release --all
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:    18.04
Codename:   bionic
# dpkg --version
Debian 'dpkg' package management program version 1.19.0.5 (amd64).
This is free software; see the GNU General Public License version 2 or
later for copying conditions. There is NO warranty.
# tar --version
tar (GNU tar) 1.29
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.

답변1

dpkgtar패키지 내용을 나열하는 데 사용됩니다 . 아카이브를 완전히 처리할 수 없는 경우 tar오류를 나타내며 이것이 dpkg보고됩니다. 두 명령 모두 작업 완료 실패를 오류로 간주하고 그에 따라 작동합니다.

grep종료하기 전에 모든 입력을 읽도록 하면 이를 방지 할 수 있습니다 .

| grep foo > /dev/null

-q( 일치가 발생하면 종료하는 대신 ).

답변2

dpkggrepSIGPIPE에서 오류를 생성하지 않고 출력을 모두 전달하기 전에 출력을 흡수하는 명령을 사용할 수도 있습니다 . perl이것은 명령입니다:

dpkg --contents some.deb | perl -0777 -pe1 | grep --quiet foo

옵션의 perl의미는 다음과 같습니다.

  • -0777전체 입력을 한 줄에 넣습니다.
  • -p표준 입력에서 각 "줄"을 읽고 표준 출력으로 인쇄합니다.
  • -e11각 입력 "행"에 대해 주어진 식( )을 평가합니다.

관련 정보