Фоновые и передние задания bash/zsh без добавления новых строк в сообщениях "продолжение / приостановка"

У меня есть процесс, который идет примерно так:

  • Запустите команду, которая генерирует кучу результатов в кучу файлов
  • Откройте файл в VIM
  • Изменить один из результатов
  • Фон vim, получить следующий результат, передний план vim
  • Повторяйте, пока список не будет завершен

Однако каждый раз, когда я создаю фоновый и передний план vim, bash/zsh печатает два сообщения, которые выглядят так:

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim

Это раздражает, потому что они занимают место на экране и в конечном итоге результаты отфильтровываются от экрана. Я должен повторить команду или постоянно прокручивать вверх и вниз, чтобы найти ее.

Есть ли способ получить сообщения "продолжение / приостановлено", чтобы избежать добавления новых строк? Как вариант, могу я их вообще подавить.

0 ответов

Методы для этого:


Это не самый эффективный способ сделать это, но это рабочий метод. Вот предполагаемая структура файла:

backgroundRun.sh
|
tmp
|
|_ outFile.txt

Вот как backgroundRun.sh будет смотреться:

backgroundRun.sh:

#backgroundRun.sh
myCommand > tmp/outFile.txt 2>&1 &

Вывод кода:

./backgroundRun.sh
user@domain~$

Как это устроено:

Основная концепция заключается в том, что весь выход из myCommand (Смотреть на backgroundRun.sh) хранится в tmp/outFile.txt, пока работает в фоновом режиме.

PS: outFile.txt будет пустой файл (заполнитель).


Это эффективный метод. Проблема с этим в том, что вывод будет отражен на экране (если у вас есть). Просто такая простая команда:

(myCommand &) #Hit enter:
user@domain~$

Как это работает: этот код о простоте; Все, что он делает, это команда (в фоновом режиме) в подоболочке.


Это еще один эффективный метод. Здесь вам нужен только один файл: backgroundRun.sh, Вот код:

backgroundRun.sh:

myCommand & > /dev/null 2>&1

Вывод кода:

./backgroundRun.sh
user@domain~$

Как это устроено:

Он запускает команду, выводя ее /dev/null, Если это не работает, выдает ошибку (2>&1).

PS: этот код будет работать только на *nix/POSIX системах, так как /dev/null отсутствует в других ОС

Не совсем полное решение, но больше строк, чем позволит комментарий...

Следующее работает для уменьшения количества пустых строк (протестировано с помощью bash на Raspbian/Debian, только с vi). Ключевым шагом является запуск вложенного bash в интерактивном режиме, но скрывая stderr выход:

bash -i 2>/dev/null

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

vi firstfile

Тогда, когда вы фон vi (например, CtrlZ), обычный [1]+ Stopped vi firstfile сообщение подавляется как предсказано. Это общий результат на данный момент:

~ $ bash -i 2>/dev/null

когда fg набирается (снова печатать вслепую), это возвращает вас к vi сессия. Однако в следующий раз вы фон viэто открывает следующую строку вывода, подтверждающую то, что было основано ранее:

~ $ bash -i 2>/dev/null
vi firstfile

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

fg>a

- a это просто фиктивный файл с коротким именем для сохранения ввода fg>/dev/null,

Этого было достаточно, чтобы полностью остановить вывод управления заданиями. Несколько сценариев оболочки могут помочь, но кажется, что это может быть доработано... Я с нетерпением жду новых ответов.

Если вы используете VIM, почему вы должны приостановить VIM? Все, что вам нужно, это последовательность:

% vim
:! youShellCommands
:e youFilename
.... over and over again

Это решает проблему более элегантно и без отключения диагностических сообщений.

ИЛИ ЖЕ

В bash введите следующую функцию:

function ff() { fg 2> /dev/null 1>&2 ; }

и используйте ff вместо fg. Отныне сессия будет выглядеть так:

% vi

[1] + Stopped vi
% ff
% ff
% ff

Не отключайте диагностические сообщения глобально для всего bash, потому что тогда работа в консоли будет чрезвычайно трудной. Как бы вы узнали, правильно ли выполнялись команды или нет.

РЕДАКТИРОВАТЬ: небольшая заметка. Ядро SIGTSTP отвечает за отправку процесса в фоновом режиме. Обычно запускают CTRL + Z (или иногда CTRL + Y). Он имеет номер 20. Вы можете вызвать его программно, например, kill -20 PIDNumber Чтобы избавиться от обратной связи, вам придется перезаписать службу сигналов SIGTSTP. Стоило того? Если да: в C напишите это так:

#include <stdio.h> 
#include <signal.h> 

void signalHandler(int sig_num) 
{ 
    // here is a new code for handling the signal
    // signal(SIGTSTP, ...etc.     
} 

signal(SIGTSTP, signalHandler); 
Другие вопросы по тегам