Не останавливайте make'ing, если команда перестала работать, но проверьте статус выхода

Пропускать любой > ... блок:

 awk '/^>/ { p = !p } p' input.txt

p флаг печати - p средства печатают когда p верно, как действие по умолчанию print когда ни один не обеспечивается. В awk, переменные начинаются пустой, который оценивает ко лжи в булевых контекстах. Каждый раз a > ... строка достигнута, переключитесь p флаг.

Распечатать каждый nблок th, разграниченный > ... строки:

awk -v n=200 '/^>/ { if (skip == 0) skip = n - 1; else --skip; } skip == n - 1' input.txt

Это - подобная логика, кроме с тех пор n не 2, мы должны использовать счетчик вместо булева флага. Здесь, skip количества, насколько больше > ... строки для пропуска, прежде чем мы начнем печатать снова. Я использую skip == n - 1 как флаг печати как что-то вроде короткого пути.

23
05.09.2014, 14:24
3 ответа

Каждая команда обновления в правиле Makefile выполняется в отдельной оболочке. Таким образом, $? не содержит статуса выхода предыдущей неудачной команды, а содержит любое значение по умолчанию для $? в новой оболочке. Поэтому ваш тест [ $? -eq 0 ] всегда проходит успешно.

15
27.01.2020, 19:42

Из GNU делает документацию:

Когда ошибки должны быть проигнорированы, из-за флага '-' или '-i', делает так же, как success, обращение с возвратом ошибки, за исключением того, что выводит сообщение о статусе кода, с которым оболочка завершила работу, и говорит, что ошибка была проигнорирована.

Чтобы использовать статус выхода make в подобном случае, выполните make из скрипта:

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

И пусть ваш Makefile будет содержать:

all:
    /bin/false
9
27.01.2020, 19:42

Почтовый сервер поврежден. Он утверждает, что имеет сообщение под номером 1 в команде UIDL, но затем команда LIST, пытающаяся получить размер этого сообщения, утверждает, что такое сообщение отсутствует.

-121--174998-

Проверка $? не требуется, поскольку & & работает, если $? равно нулю и | | выполняется в случае ненулевого возвращаемого значения.

И вы не нуждаетесь в минусе, так как при возврате значение, которое нужно сделать, берется из последнего продолжающегося программного вызова линии. Таким образом, это хорошо работает

неудача:

      @/bin/false && echo "success!" || echo "failure!" 

успех:

      @/bin/true && echo "success!" || echo "failure!"

противоположное происходит: Если вы хотите сделать свое собственное сообщение и хотите сломать сделать процесс так или иначе с ненулевым значением, вы должны написать что-то вроде этого:

неудача:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }
10
27.01.2020, 19:42

Теги

Похожие вопросы