主终端窗口仅显示命令

由于某些命令的长文本输出,我经常失去对命令流的跟踪,所以我想有一个主终端窗口执行用户命令, 其他终端窗口 “弹出”显示命令的输出然后是使用快捷方式关闭。

是否可以编码这样的行为? 关于我应该使用的语言的任何提示?

一个更加用户友好的交互将是终端询问是否应该在超出用户设置限制时在外部显示输出。

我对编程语言知之甚少,但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 ,它做
  • ( … ) – 启动在子shell中,这将释放原始终端,以便即使其他输出终端仍处于打开状态时也可以执行新命令
  • xterm -hold -e … – 运行xterm ,运行并在命令完成后打开它
  • 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éphaneChazelas的精彩答案,他的解决方案在这里使用。 如果这对您有任何帮助,请访问链接的问题并提出他的答案。

~/.bashrc添加到~/.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 } 

当然,这可以进行高度调整和定制,但我认为这是一个良好的开端。

而现在完全不同的东西™

实现目标的一种完全不同的方法是使用shell输出重定向。 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'来确定打开的终端会话 改为ls /dev/pts | sed '/^[0p]/d'