San*_*dzé 1 command-line bash gnome-terminal bashrc
由于某些命令的长文本输出,我经常失去对命令流的跟踪,所以我想要一个主终端窗口,在其中执行用户命令,其他终端窗口“弹出”显示命令的输出,然后是使用捷径关闭。
是否可以对这种行为进行编码?关于我应该使用的语言的任何提示?
如果输出超过用户设置的限制,终端会询问是否应该在外部显示输出,这是一种更加用户友好的交互。
我对编程语言知之甚少,但 Bash 绝对可以设置为您想要的方式,所以我将如何做到这一点。
在您的~/.bash_aliases
或~/.bashrc
文件中定义一个函数,允许您在新终端中启动您的命令,例如
foo () { ( xterm -hold -e bash -c "$*" & ) ;}
Run Code Online (Sandbox Code Playgroud)
这种方式foo echo bar
打开一个新xterm
的echo bar
,bar
它只显示 的输出,这里这将是一个只有单词的窗口。必须引用一系列命令,例如foo "echo bar && echo baz"
. 您可以使用xterm
您选择的终端模拟器进行替换,但您需要弄清楚保持打开选项是什么——阅读man
页面。选项-e
应该适用于所有人。请注意,作为函数名称,您甚至可以选择单个符号,例如:
,_
或·
( AltR+ ,)。
foo () { … ;}
-定义一个函数foo
,其不…
( … )
-…
在子shell中启动,这会释放原始终端,以便即使其他输出终端仍然打开也可以执行新命令xterm -hold -e …
– run xterm
,运行…
,-hold
命令完成后打开bash -c " … "
– 执行命令…
,需要能够运行多个命令$*
– 匹配foo
= 之后的完整命令链的每个参数foo
默认情况下,您可以使用桌面环境的标准快捷方式关闭输出终端 – Alt+ F4。
如果您希望输出终端在命令完成后保持打开状态五秒钟,您需要像这样定义函数:
foo () { ( xterm -e bash -c "$* && sleep 5" & ) ;}
Run Code Online (Sandbox Code Playgroud)
更换&&
用&
的,直到命令完成终端只停留开放,但至少五秒钟。
xdotool
(又丑又脏,嘘)foo
在主终端中的每个命令之前键入都会打扰您,因此我为此设置了一个肮脏的解决方法 -xdotool
如有必要,请先安装。当你打开你的主终端时,首先设置这个变量:
PROMPT_COMMAND='xdotool type "foo "'
Run Code Online (Sandbox Code Playgroud)
这将自动键入foo
后跟一个空格,但不幸的是也在每个新提示之前。您要做的就是键入您的(链)命令。
perl
函数(非常酷)在Unix.SE上提出了如何执行以下操作的问题,并得到了Stéphane Chazelas的精彩回答,此处使用了他的解决方案。如果这对您有任何帮助,请访问链接的问题并支持他的回答。
将以下行添加到您的~/.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'" ;}
Run Code Online (Sandbox Code Playgroud)
现在,当您打开一个新终端并运行时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
}
Run Code Online (Sandbox Code Playgroud)
当然,这可以高度调整和定制,但我认为这是一个好的开始。
实现目标的一种完全不同的方式是使用 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)
Run Code Online (Sandbox Code Playgroud)
您可以通过简单地将例如附加> /dev/pts/1
到您的命令将输出发送到它们中的任何一个,当然也可以在如上所示的函数中使用。
GNOME 终端模拟器 ( gnome-terminal
) 会话不显示who
,但pts
设备对它们来说是平等的。您可以通过尝试或ls /dev/pts | sed '/^[0p]/d'
代替来确定打开的终端会话。