Intereting Posts
Изменение linux для разных плат Bash – ввод данных для замещенной команды, хранящейся в переменной Как восстановить данные TrueCrypt? Не удалось запустить chmod, chown и даже ls в папке Транзакционная оболочка UNIX для изменения файловой системы Строковые артефакты из истории в командной строке Как открыть терминал, разделить на 9 терминалов и переключиться между ними, используя один скрипт? Установка пакета вручную с помощью apt-get Найти имя пользователя и пароль в файле pcap Возможно ли преобразовать настройку bios в Uefi? Не устанавливайте общие папки NFS с помощью бродячего поставщика libvirt в Debian Jessie Подключение SFTP через другой сервер Поиск слова из определенного файла словаря в sdcv (консольная версия словаря Stardict) Установить гостевые дополнения на Kali Linux на VirtualBox 5 на Mac OSX? Пустой рабочий стол после установки xrdp на Centos 6.5 с XFCE в качестве оконного менеджера

Ошибка фиксации сигнала 13 (SIGPIPE) для поиска и grep-конвейера

У меня есть ситуация, когда я пытаюсь установить программное обеспечение в свою систему.

Я использую подход fakeroot, чтобы установить их в отдельный каталог, где я перечисляю все файлы, каталоги и ссылки, которые они устанавливают, в три файла FILES , DIRS , LINKS .

Затем я использую find для получения хэшей SHA1 всех файлов в файле с именем sha1sums . Мне не нужен хэш файла sha1sums . Поэтому я использовал эту команду

  find . -type f -exec sha1sum {} \; | grep -ve "\./sha1sums$" >sha1sums 

Это отлично работает. Однако при установке kbd-2.0.3 он выдал много строк ошибок,

  find: 'sha1sum' terminated by signal 13 

Я знаю, что сигнал 13 является сигналом SIGPIPE («Broken Pipe»). Но у меня нет двух вещей:

  1. Почему это происходит только с этим пакетом?
  2. Вероятно, это связано с тем, что grep закрывает трубу чтения. Но почему он закрывает его?

Я не могу воспроизвести вашу проблему с версиями GNU всех утилит, которые вы используете, и с моими родными утилитами OpenBSD.

Однако, вместо того, чтобы sha1sums имя файла sha1sums с помощью sha1sums через grep , вы можете вообще не sha1sums вычисление SHA1 для этого файла:

 find . -type f ! -name sha1sums -exec sha1sum {} + >sha1sums 

Тест negated -name удалит имя файла из списка имен, переданных в sha1sum .

Кроме того, утилита будет вызываться с максимально возможным количеством файлов за один раз, а не один раз для каждого имени, благодаря + в конце.

Поскольку это не использует конвейер, проблема с SIGPIPE не будет.