Я часто теряю след потока команды из-за вывода длинного текста некоторых команд, таким образом, я хотел бы иметь основное окно терминала, где пользовательские команды выполняются и другие окна терминала, которые „открываются “, отображая вывод команд и затем закрываются с использованием ярлыка.
Действительно ли возможно кодировать такое поведение? Какие-либо подсказки о языке я должен использовать?
Еще более удобное для пользователя взаимодействие состояло бы в том, чтобы терминал спросил, должен ли он отобразить вывод внешне, если он превышает установленный пользователями предел.
Я знаю мало о языках программирования, но 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
сопровождаемый пространством после, но к сожалению также перед каждой новой подсказкой. Все уехали, чтобы сделать необходимо ввести Ваш (цепочка) команда (команды).
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
}
Конечно, это можно высоко настроить и настроить, но я думаю, что это - хорошее начало.
Полностью другой способ достигнуть Вашей цели использует перенаправление вывода оболочки. 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'
вместо этого.