常规设置

常规设置

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

是否可以对此类行为进行编码?关于我应该使用的语言有什么建议吗?

更加用户友好的交互方式是让终端如果超出用户设置的限制,是否应该在外部显示输出。

答案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函数
  • ( … )在子 shell 中启动,这将释放原始终端,以便即使在其他输出终端仍打开的情况下也可以执行新命令
  • 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操作系统并得到了一个精彩的答案斯蒂芬·查泽拉斯,这里用的是其解决方案。如果这对您有帮助,请访问链接的问题并点赞他的答案。

将以下行添加到~/.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'

相关内容