我正在尝试将一个 shell 绑定到我的 gentoo fluxbox 上的一个键。这个想法是让一个 shell 每次我按下 时都会显示或隐藏F11
,但保持相同的 shell,而不是每次都创建一个新的 shell。
现在,我已经设法做到了。
我已插入我的.fluxbox/keys
:
F11 :ExecCommand /home/me/script/toogle-sticky-shell
被调用的脚本很简单:
##!/bin/sh
pid=$(ps -ef | grep surxv | head -n -1 | head -c 14 | tail -c 5)
if [ $pid ]
kill $pid
else
urxvt -name surxvt -e screen -RD StickyShell &
fi
并适应了我的.fluxbox/apps
:
[app] (name=surxvt)
[Hidden] {yes}
[Layer] {2}
[Position] (WINCENTER) {0 0}
[Deco] {BORDER}
[Tab] {no}
[FocusNewWindow] {yes}
[Sticky] {yes}
[end]
因此,基本上,为了让我的 shell 保持活动状态,我正在使用screen
。但我觉得这不是一个“干净”的解决方案。
所以我的问题是:有没有更清洁的方法来实现这一点?
例如,是否可以通过按下某个键来有选择地隐藏/显示 fluxbox 窗口?
答案1
安装 wmctrl
x11-misc/wmctrl Homepage: http://tomas.styblo.name/wmctrl/ Description: command line tool to interact with an EWMH/NetWM compatible X Window Manager
启动一个“命名”终端
urxvt -name moo
使用以下方式编写切换最小化脚本
wmctrl -x -r moo.URxvt -b toggle,hidden
并从密钥文件中调用。
F11 :ExecCommand /home/me/script/toogle-hidden moo
如果您需要更多提示,我很乐意提供帮助。
顺便说一句,我不认为你之前的方法不好。除了你查找 pid 的方式和 screen 的一些注意事项(非关键)外,它没有任何问题。
更新:
屏幕缩回并不是一个真正的问题,因为您可以滚动(在复制模式下,按 ^A + [),并且可以通过设置 DISPLAY 到达 X。有些人会让您相信这tmux
是仅次于启蒙的最佳选择,但我倾向于像对待 zsh 狂热者一样将它们一笔勾销……
另一件事是不合理的,因为您在特定的字符串偏移量(head -c)处查找 pid,并且因为 grep 关键字必然会在某个时候给您一个错误的 pid(几行)。例如:
$ ps -ef | grep moo
jaroslav 20089 1 0 Jul23 ? 00:00:00 SCREEN -dR moo
jaroslav 26545 26420 0 08:21 pts/10 00:00:01 rxvt-unicode -name moo
jaroslav 27702 26981 0 08:52 pts/12 00:00:00 /usr/bin/perl /usr/bin/cowsay moo
jaroslav 27704 26771 0 08:52 pts/7 00:00:00 grep --colour=auto moo
这将关闭屏幕,而不是终端仿真器。预先假设 ps 产生特定数量的行或某些列具有给定的宽度(我认为您假设 3 行带标题,前两列有 14 个字符),这是“不安全的”。
我会选择这样的方法:
ps `pidof rxvt-unicode` | grep -m1 -e '-nam[e] moo' | awk '{ print $1 }'
或者
ps ax | awk '$0 ~ /rxvt-unicode.*-nam[e] moo/ {print $1; exit}'
有了这两个,至少我可以相当肯定 pid 属于一个 rxvt 终端,它是以 -name moo 作为其两个参数启动的。并且绝对肯定输出最多只有一个 pid。-name[e] 是一个避免ps | grep
在输出中匹配命令的老把戏。
这一切都是吹毛求疵...经验法则就是这样。
- 不要假设程序的输出是 x 个字符宽或 y 行长。
- 长正则表达式(更严格)几乎总是比短正则表达式更好。