Я часто теряю отслеживание потока команд из-за длинного вывода текста некоторых команд, поэтому я хотел бы иметь главное окно терминала, в котором выполняются пользовательские команды, и другие окна терминала, которые «всплывают», выводят вывод команд и затем закрываются с помощью короткого замыкания.
Можно ли закодировать такое поведение? Любые советы о языке, который я должен использовать?
Еще более удобное для пользователя взаимодействие было бы для терминального основного окна терминала , должно ли оно выводить внешний вывод, если оно превышает пользовательский предел.
Я мало знаю о языках программирования, но Bash может определенно настроить себя так, как вы этого хотите, поэтому вот как я это сделаю.
Определить функцию в файле ~/.bash_aliases или ~/.bashrc, который позволяет вам запускать вашу команду в новом терминале, например
foo () { ( xterm -hold -e bash -c "$*" & ) ;}
Таким образом, foo echo bar открывает новый xterm, который показывает только вывод из echo bar, здесь это будет окно с только словом bar в нем. Цепочка команд должна быть указана, например. [F13]. Вы можете заменить xterm на эмулятор терминала по вашему выбору, но вам нужно выяснить, какой вариант остается открытым - прочитать страницу man. Опция -e должна работать для всех из них. Обратите внимание, что в качестве имени функции вы можете выбрать даже один символ, например :, _ или · (AltR +,).
Вы можете закрыть выходной терминал, используя стандартный ярлык среды рабочего стола для этого - AltR + F4 по умолчанию.
Если вы хотите, чтобы выходной терминал оставался открытым, скажем, через пять секунд после завершения команды, вам необходимо определить такую функцию :
foo () { ( xterm -e bash -c "$* && sleep 5" & ) ;}
Заменить && на & на срок
Вам будет нужно вводить foo перед каждой отдельной командой на вашем основном терминале, поэтому я установил для этого грязное обходное решение - сначала установите xdotool, если это необходимо. Когда вы открываете свой основной терминал, сначала установите эту переменную:
PROMPT_COMMAND='xdotool type "foo "'
Это автоматически напечатает foo, а затем пробел после, но, к сожалению, также перед каждым новым приглашением.
остается открытым
Добавьте следующие строки в ваш файл ~/.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'.
Я мало знаю о языках программирования, но Bash может определенно настроить себя так, как вы этого хотите, поэтому вот как я это сделаю.
Определить функцию в файле ~/.bash_aliases или ~/.bashrc, который позволяет вам запускать вашу команду в новом терминале, например
foo () { ( xterm -hold -e bash -c "$*" & ) ;}
Таким образом, foo echo bar открывает новый xterm, который показывает только вывод из echo bar, здесь это будет окно с только словом bar в нем. Цепочка команд должна быть указана, например. [F13]. Вы можете заменить xterm на эмулятор терминала по вашему выбору, но вам нужно выяснить, какой вариант остается открытым - прочитать страницу man. Опция -e должна работать для всех из них. Обратите внимание, что в качестве имени функции вы можете выбрать даже один символ, например :, _ или · (AltR +,).
Вы можете закрыть выходной терминал, используя стандартный ярлык среды рабочего стола для этого - AltR + F4 по умолчанию.
Если вы хотите, чтобы выходной терминал оставался открытым, скажем, через пять секунд после завершения команды, вам необходимо определить такую функцию :
foo () { ( xterm -e bash -c "$* && sleep 5" & ) ;}
Заменить && на & на срок
Вам будет нужно вводить foo перед каждой отдельной командой на вашем основном терминале, поэтому я установил для этого грязное обходное решение - сначала установите xdotool, если это необходимо. Когда вы открываете свой основной терминал, сначала установите эту переменную:
PROMPT_COMMAND='xdotool type "foo "'
Это автоматически напечатает foo, а затем пробел после, но, к сожалению, также перед каждым новым приглашением.
остается открытым
Добавьте следующие строки в ваш файл ~/.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'.
Я мало знаю о языках программирования, но Bash может определенно настроить себя так, как вы этого хотите, поэтому вот как я это сделаю.
Определить функцию в файле ~/.bash_aliases или ~/.bashrc, который позволяет вам запускать вашу команду в новом терминале, например
foo () { ( xterm -hold -e bash -c "$*" & ) ;}
Таким образом, foo echo bar открывает новый xterm, который показывает только вывод из echo bar, здесь это будет окно с только словом bar в нем. Цепочка команд должна быть указана, например. [F13]. Вы можете заменить xterm на эмулятор терминала по вашему выбору, но вам нужно выяснить, какой вариант остается открытым - прочитать страницу man. Опция -e должна работать для всех из них. Обратите внимание, что в качестве имени функции вы можете выбрать даже один символ, например :, _ или · (AltR +,).
Вы можете закрыть выходной терминал, используя стандартный ярлык среды рабочего стола для этого - AltR + F4 по умолчанию.
Если вы хотите, чтобы выходной терминал оставался открытым, скажем, через пять секунд после завершения команды, вам необходимо определить такую функцию :
foo () { ( xterm -e bash -c "$* && sleep 5" & ) ;}
Заменить && на & на срок
Вам будет нужно вводить foo перед каждой отдельной командой на вашем основном терминале, поэтому я установил для этого грязное обходное решение - сначала установите xdotool, если это необходимо. Когда вы открываете свой основной терминал, сначала установите эту переменную:
PROMPT_COMMAND='xdotool type "foo "'
Это автоматически напечатает foo, а затем пробел после, но, к сожалению, также перед каждым новым приглашением.
остается открытым
Добавьте следующие строки в ваш файл ~/.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'.