总结:
- 我有一个简单的 shell 脚本,它根据环境变量的当前值,将值从翻转
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,但脚本结束后,环境变量的改变不会持续。
答案1
这是预期的行为。程序只能为其自身及其子进程设置环境变量。
根据您的情况,您可以将当前状态存储在一个文件中(例如),然后根据该文件的内容采取行动。或者,您可以通过查看(使用 grep 等)的输出(或任何其他的输出)~/.active-modemap
来获取当前使用的模式映射。xmodmap -pke
modemap