Главное окно терминала Отображение только команд

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

Можно ли закодировать такое поведение? Любые советы о языке, который я должен использовать?

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

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

3 ответа

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

General Setup

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

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

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

Пояснения

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

Точная настройка

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

Вы можете закрыть выходной терминал, используя стандартный ярлык среды рабочего стола для этого - AltR + F4 по умолчанию.

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

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

Заменить && на & на срок

Ввод облегчения

Использование xdotool (уродливое и грязное, boo)

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

PROMPT_COMMAND='xdotool type "foo "'

Это автоматически напечатает foo, а затем пробел после, но, к сожалению, также перед каждым новым приглашением.

Использование функции perl (массовое охлаждение)

остается открытым

Добавьте следующие строки в ваш файл ~/.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 "(С автоматически добавленным пространством) появится после каждого нового приглашения. Если вы введете что-то во время выполнения команды, «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
}

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

И теперь для чего-то совершенно другого ™

Совершенно другим способом достижения вашей цели является перенаправление вывода оболочки. who дает список запущенных терминалов, например :............d39]

> 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
ответ дан 22 May 2018 в 18:39
  • 1
    Независимо от того, сколько новых терминалов я открываю, who дает мне только имя пользователя tty7 – Sandro Sivsivadzé 9 September 2017 в 00:09
  • 2
    Я использую эмулятор терминала GNOME. Устанавливается по умолчанию на моем Ubuntu. – Sandro Sivsivadzé 9 September 2017 в 00:39
  • 3
    Он работает с xterm. Я получаю список рабочих терминалов после who. – Sandro Sivsivadzé 9 September 2017 в 00:42
  • 4
    Вы не знаете, как много Мне понравилось работать с этим ... – dessert 9 September 2017 в 02:05
  • 5
    @dessert - очень крутой отзыв, спасибо! Очень хорошо работает с терминалами, где у вас может быть разделенный экран, например Kune Konsole: img.ctrlv.in/img/17/09/09/59b3e80a09d1f.png – Andy Turfer 9 September 2017 в 16:13

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

General Setup

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

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

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

Пояснения

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

Точная настройка

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

Вы можете закрыть выходной терминал, используя стандартный ярлык среды рабочего стола для этого - AltR + F4 по умолчанию.

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

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

Заменить && на & на срок

Ввод облегчения

Использование xdotool (уродливое и грязное, boo)

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

PROMPT_COMMAND='xdotool type "foo "'

Это автоматически напечатает foo, а затем пробел после, но, к сожалению, также перед каждым новым приглашением.

Использование функции perl (массовое охлаждение)

остается открытым

Добавьте следующие строки в ваш файл ~/.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 "(С автоматически добавленным пространством) появится после каждого нового приглашения. Если вы введете что-то во время выполнения команды, «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 }

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

И теперь для чего-то совершенно другого ™

Совершенно другим способом достижения вашей цели является перенаправление вывода оболочки. who дает список запущенных терминалов, например :............d39] > 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
ответ дан 18 July 2018 в 07:10

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

General Setup

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

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

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

Пояснения

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

Точная настройка

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

Вы можете закрыть выходной терминал, используя стандартный ярлык среды рабочего стола для этого - AltR + F4 по умолчанию.

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

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

Заменить && на & на срок

Ввод облегчения

Использование xdotool (уродливое и грязное, boo)

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

PROMPT_COMMAND='xdotool type "foo "'

Это автоматически напечатает foo, а затем пробел после, но, к сожалению, также перед каждым новым приглашением.

Использование функции perl (массовое охлаждение)

остается открытым

Добавьте следующие строки в ваш файл ~/.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 "(С автоматически добавленным пространством) появится после каждого нового приглашения. Если вы введете что-то во время выполнения команды, «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 }

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

И теперь для чего-то совершенно другого ™

Совершенно другим способом достижения вашей цели является перенаправление вывода оболочки. who дает список запущенных терминалов, например :............d39] > 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
ответ дан 24 July 2018 в 18:45

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

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