Как заставить конвейер ждать конца файла или останавливаться после ошибки?

Возможно, я неправильно понимаю, но вы не можете изменить аргументы командной строки, которые загрузчик передает ядру после того, как вы уже запустили ядро, насколько я знаю,... если вы имеете в виду, как настроить параметры ядра во время выполнения, то инструмент называется sysctl.

Если, например,ты хотел изменить:

sysctl -w kernel.stack_tracer_enabled=1

Эти изменения будут потеряны после перезагрузки.

12
27.04.2019, 22:26
2 ответа

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

Таким образом, вы не можете избежать запуска одного этапа конвейера, потому что

  1. команда на этом этапе запускается, как только запускаются все остальные этапы, и
  2. Если бы команда не использовала входные данные, поступающие по конвейеру, она заблокировала бы предыдущие этапы конвейера.

Вместо этого запишите вывод в файл, дав конвейеру завершить работу. Затем используйте этот файл.

Пример (как функция с одним аргументом):

myman () {
    tmpfile=$( mktemp )

    if man -k "$1" | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf >"$tmpfile" && [ -s  "$tmpfile" ]
    then
        zathura "$tmpfile"
    fi

    rm -f "$tmpfile"
}

Кроме того, программа zathuraне будет запускаться, если конвейер выйдет из строя, (часть xargsвернет не -ноль )или сгенерированный файл будет пустым.

В оболочке bashвы также можете установить параметр оболочки pipefailс set -o pipefail, чтобы конвейер возвращал статус выхода первой неудачной команды в конвейере. И вы хотели бы сделать переменную tmpfilelocal:

myman () {
    local tmpfile=$( mktemp )

    if [ -o pipefail ]; then
        set -o pipefail
        trap 'set +o pipefail' RETURN
    fi

    if man -k "$1" | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf >"$tmpfile"
    then
        zathura "$tmpfile"
    fi

    rm -f "$tmpfile"
}

Это устанавливает параметр pipefailна время действия функции, если он еще не был установлен, а затем при необходимости снимает его. Он избавляется от теста -sв выходном файле.

6
27.01.2020, 19:54

Файлы PDF должны быть доступны для поиска; любому просмотрщику PDF придется сначала просмотреть трейлер, а оттуда перейти к смещениям из таблицы внешних ссылок.

Поскольку поиск по каналам невозможен, zathuraиспользует запутывающий трюк, копируя все входные данные во временный файл, а затем используя этот временный файл, как обычно. Такой «хитрый» трюк порождает ложные надежды и заставляет людей предполагать, что pdf-файлы доступны для потоковой передачи.

Но в любом случае, zathuraдействительно ждет EOF перед отображением документа, вам не нужно ничего делать для этого:

(sleep 10; cat file.pdf) | zathura -
# will really show the content of file.pdf after 10 seconds

Проблема в том, что zathuraнет возможности открыть окно только в том случае, если файл в порядке, и выйти с ошибкой, если это не так --он просто останется там, как будто все в порядке:

$ dd if=file.pdf bs=50000 count=1 status=none | zathura -
error: could not open document  # its window still hanging around showing nothing

$ echo $?
0  # really?

Таким образом, даже если вы сами перенаправляете вывод во временный файл и запускаете только zathura, если все в порядке, нет гарантии, что пользователь не увидит черное окно, если zathuraне работает. t нравится вывод по той или иной причине.


Кстати,

man -X man

отобразит справочную страницу в окне X11 с gxditview, даже если она выглядит прямо из 70-х;-)

И, конечно же, вы всегда можете использовать:

... | xargs xterm -e man

, который, помимо многих других улучшений, позволит вам использовать регулярные выражения при поиске и правильном выделении текста.

6
27.01.2020, 19:54

Теги

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