Фоновые и передние задания bash / zsh без добавления новых строк в сообщениях «продолжение / приостановка» - PullRequest
0 голосов
/ 09 февраля 2019

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

  • Запустите команду, которая генерирует кучу результатов в кучу файлов
  • Откройте файл в vim
  • Редактировать один из результатов
  • Background vim, получить следующий результат, foreground vim
  • Повторять до полного заполнения списка

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

[1]  + 4321 continued  nvim

[1]  + 4321 suspended  nvim

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

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

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

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

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

bash -i 2>/dev/null

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

vi firstfile

Затем, когда вы фон vi (например, Ctrl Z ), обычное сообщение [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.

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

0 голосов
/ 15 марта 2019

Если вы используете 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); 
0 голосов
/ 10 марта 2019

Способы сделать это:


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

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 отсутствует в других ОС)

...