由于某些命令的文本输出很长,我经常会忘记命令流,所以我想有一个主终端窗口执行用户命令的位置其他终端窗口“弹出”窗口显示命令的输出,然后使用快捷方式关闭。
是否可以对此类行为进行编码?关于我应该使用的语言有什么建议吗?
更加用户友好的交互方式是让终端问如果超出用户设置的限制,是否应该在外部显示输出。
答案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'
。