Основные команды отображающего окна терминала только

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

Действительно ли возможно кодировать такое поведение? Какие-либо подсказки о языке я должен использовать?

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

1
задан 9 September 2017 в 15:45

1 ответ

Я знаю мало о языках программирования, но Bash может определенно настроить для поведения как Вы, хотят это, таким образом, вот то, как я сделал бы это.

Общая установка

Определите функцию в Вашем ~/.bash_aliases или ~/.bashrc файл, который позволяет Вам запускать свою команду в новом терминале, например.

foo () { ( xterm -hold -e bash -c "$*" & ) ;}

Сюда foo echo bar открывает новое xterm который показывает просто вывод echo bar, здесь это было бы окном только с словом bar в нем. Цепочка команд должна быть заключена в кавычки, например. foo "echo bar && echo baz". Можно занять место xterm эмулятором терминала по Вашему выбору, но необходимо выяснить то, что пребывание открытая опция – читает man страница. Опция -e должен работать на всех них. Обратите внимание, что как имя функции можно выбрать даже отдельный символ как :, _ или · (AltR +).

Объяснения

  • foo () { … ;} – определите функцию foo который делает
  • ( … ) – запустить в подоболочке это выпускает исходный терминал так, чтобы новая команда могла быть выполнена, даже когда другие выходные клеммы все еще открыты
  • xterm -hold -e … – выполненный xterm, выполненный и -hold это открывается после законченной команды
  • bash -c " … " – выполните команду (команды) , необходимый, чтобы способность выполнила несколько команд
  • $* – соответствует каждому аргументу foo = полная цепочка команд после foo

Подстройка

Закрытие окна выходной клеммы

Можно закрыть выходную клемму с помощью стандартного ярлыка настольной среды для этого – Alt+F4 по умолчанию.

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

foo () { ( xterm -e bash -c "$* && sleep 5" & ) ;}

Замена && & чтобы терминал остался открытым только, пока команда не закончена, но по крайней мере пять секунд.

Входная помощь

Используя xdotool (ужасный и грязный, шиканье)

Это побеспокоит Вас для ввода foo перед каждой командой в Вашем основном терминале, таким образом, я настроил грязное обходное решение для этого – установка xdotool сначала при необходимости. Когда Вы открываете свой основной терминал, сначала устанавливаете эту переменную:

PROMPT_COMMAND='xdotool type "foo "'

Это автоматически введет foo сопровождаемый пространством после, но к сожалению также перед каждой новой подсказкой. Все уехали, чтобы сделать необходимо ввести Ваш (цепочка) команда (команды).

Используя a perl функция (в широком масштабе прохладный)

Вопрос, как выполнить следующее, задали на Unix. SE и получил блестящий ответ Stéphane Chazelas, решение которого используется здесь. Если это помогает Вам всегда по возможности посетить связанный вопрос и upvote его ответ.

Добавьте следующие строки к Вашему ~/.bashrc файл и сохраняет его:

insert() { perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@" ;}
auto_enter() { bind $'"\u200b":"\1'$1' \5"'; PROMPT_COMMAND="insert $'\u200b'" ;}

Теперь, когда Вы открываете новый терминал и работаете auto_enter foo, строка “нечто” (с пространством, автоматически добавленным), появится после каждой новой подсказки. При вводе чего-то, в то время как команда выполняется, “нечто” будет вставленным даже перед этим текстом.

Удобное для пользователя взаимодействие

Эта версия функции сохраняет вывод во временном файле, считает его строки и спрашивает пользователя, отобразить ли его в новом окне:

foo () {
  limit=10 # set line limit
  tf=$(mktemp) # create temp file
  "$@" > $tf # execute command, save output in temp file
  lc=$(wc -l < $tf) # get output's line count
  [ $lc -ge $limit ] && # if line count >= limit then
  ( read -p "The output is $lc lines long, do you want to open it in a new window (y/n)? " yn
    case $yn in
        [Yy]* ) xterm -hold -e "cat $tf" & exit;; # open in new window, send to background and exit
        [Nn]* ) cat $tf; exit;; # print output to stdout and exit
        * ) echo "Please answer yes or no.";; # wrong answer
    esac ) || # else
  cat $tf # print output to stdout
}

Конечно, это можно высоко настроить и настроить, но я думаю, что это - хорошее начало.

И теперь для чего-то полностью Different™

Полностью другой способ достигнуть Вашей цели использует перенаправление вывода оболочки. who дает Вам список рабочих терминалов, например:

> who
username tty7         2017-09-07 20:46 (:0)
username pts/2        2017-09-07 20:47 (:0)
username pts/1        2017-09-07 21:05 (:0)

Можно отправить вывод любому из них путем простого добавления, например. > /dev/pts/1 к Вашей команде, которая, конечно, может также использоваться в функции как показано выше.

Эмулятор терминала GNOME (gnome-terminal) сессии не отображены who, тем не менее, pts устройства существуют одинаково для них. Можно определить открытые терминальные сеансы только путем попытки или с ls /dev/pts | sed '/^[0p]/d' вместо этого.

7
ответ дан 3 December 2019 в 06:24

Другие вопросы по тегам:

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