Как я могу сделать блок `enscript`, пока принтер не закончит свою работу?

Лучшим инструментом для неинтерактивного редактирования файлов на месте является например .

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

Если вы использовали vi и когда-либо вводили команду, начинающуюся с двоеточия : , вы использовали команду ex. Конечно, многие из более сложных или «причудливых» команд, которые вы можете выполнить таким образом, являются расширениями Vim (например, : bufdo ) и не определены в спецификациях POSIX для ex , но эти спецификации обеспечивают поистине удивительную степень мощности и гибкости при невизуальном редактировании текста (интерактивном или автоматическом).

Приведенная выше команда состоит из нескольких частей.

-s включает тихий режим для подготовки ex к пакетному использованию. (Подавить выходные сообщения и т. Д.)

-c указывает команду для выполнения после открытия файла ( file.txt в данном случае) в буфере.

% - спецификатор адреса, эквивалентный 1, $ - это означает, что следующая команда применяется ко всем строкам буфера.

s - это замещающая команда, с которой вы, вероятно, уже знакомы. Он обычно используется в vi и имеет по существу идентичные функции с командой s из sed , хотя некоторые из расширенных функций регулярных выражений могут различаться в зависимости от реализации. В этом случае от ".com" до конца строки заменяется просто ".com".

Вертикальная черта разделяет последовательные выполняемые команды.Во многих (большинстве) реализаций ex вы также можете использовать дополнительную опцию -c , например:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

Однако POSIX этого не требует.

Команда x завершается после записи любых изменений в файл. В отличие от wq , что означает «запись и выход», x записывает в файл только в том случае, если буфер был отредактирован. Таким образом, если ваш файл не был изменен, метка времени будет сохранена.

0
21.09.2018, 02:01
1 ответ

Поскольку это слишком велико, чтобы поместить его в комментарий, вы пытались проверить, открыты ли еще какие-либо файлы в каталоге ~/PDFво время их буферизации с помощьюlsof(LiSt Open Files )?

Добавьте этот фрагмент кода послеenscript -B -P PDF bloom.c:

# Go into endless loop and break when all files in */PDF/* are closed.
while :
do
    if ! [[ `lsof | grep /PDF/` ]]
    then
        break
    fi
    sleep 1
done

и до

mv "`ls -dtr1 ~/PDF/* | tail -1`"

Так вы потеряете всего 1 секунду...

Подробнее:

  • lsofвыведет список всех открытых файлов
  • обязательное man lsofдаст вам еще больше деталей.

;-)

1
28.01.2020, 02:42

Теги

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