TLDR:
- 我有一个简单的 shell 脚本,可以根据当前值将环境变量从 value 翻转
foo
为,或反过来。bar
- 我F12用来触发这个脚本,我知道它有效。
- 当脚本被触发时,脚本结束时新值不会持续存在。
我究竟做错了什么?
细节:
1.脚本:
我的脚本检查环境变量是否存在,如果缺少则创建它:
if [ -z $COLEMAK ];then export COLEMAK="qwerty";fi
然后脚本将值从原来的值翻转到另一个值:
if [ "$COLEMAK" == "qwerty" ]
then export COLEMAK="colemak" ; xmodmap ~/colemak.map
else export COLEMAK="qwerty" ; xmodmap ~/qwerty.map
fi
请注意,除了翻转变量值之外,脚本还用于xmodmap
将键盘从一种布局重新映射到另一种布局。这是脚本的核心目的,这就是我想从功能键触发它的原因。
我知道这个脚本只有在它被来源(. ~/foo.sh
)时才有效,并且在虚拟终端上运行良好。到目前为止,一切都很好。
2. xbindkeys:
我已经配置.xbindkeysrc.scm
为包含(xbindkey '(F12) "term &")
并在我按下时正确执行命令F12。到目前为止,一切都很好。
我将该行修改为(xbindkey '(F12) ". ~/foo.sh &")
. 我知道脚本会运行,因为当我按下时它会写入一条日志行F12,但是在脚本结束后环境变量的更改不会持续存在。
这是预期的行为。程序只能为自己及其子进程设置环境变量。
在您的情况下,您可以将当前状态存储在文件中(如
~/.active-modemap
)并对该文件的内容采取行动。或者,您可以通过(使用 grep 等)查看xmodmap -pke
(或任何其他输出modemap
)的输出来获取当前使用的模式映射。