i3wm配置问题:如何仅在工作日自动启动指定应用
解决i3wm中仅工作日启动指定应用的问题
嗨,我懂你现在卡在哪了——明明终端里能正常运行的条件命令,放到i3的exec配置里就失效,对吧?这其实是因为i3处理exec命令的逻辑和你直接在shell里执行不一样。
问题出在哪?
你原来写的配置:
exec --no-startup-id 'test $(date +%u) -lt 6 && slack'
i3默认不会把exec的参数交给shell解析,它会把整个单引号里的内容当作一个完整的程序名去查找——显然系统里不存在叫test $(date +%u) -lt 6 && slack的程序,所以自然不会生效。
而你快捷键里的写法能工作,其实是因为i3处理快捷键的exec时,会把双引号内容交给shell,但这里还有个隐藏坑:如果用双引号,$(date +%u)会在i3加载配置文件的那一刻就被展开成当时的星期数,而不是每次按快捷键时实时计算。要是你周末加载了配置,就算周一按快捷键也不会触发slack,这显然不是你想要的效果。
正确的配置写法
要让i3正确解析条件命令,你需要显式调用shell来执行整个逻辑,比如用bash -c把命令包裹起来:
启动时自动执行(工作日启动slack)
exec --no-startup-id bash -c 'test $(date +%u) -lt 6 && slack'
快捷键触发(实时判断工作日)
如果要让快捷键也能实时判断工作日状态,应该改成:
bindsym $mod+i exec bash -c 'test $(date +%u) -lt 6 && slack'
为什么这样能行?
bash -c告诉i3:“把后面的字符串交给bash shell去解析执行”,这样shell会处理$(date +%u)的变量展开,以及&&的条件判断逻辑。date +%u返回1(周一)到7(周日),test $(date +%u) -lt 6会在周一到周五返回真,此时才会执行slack启动程序。
验证方法
你可以先在终端里直接运行这个命令,确认效果:
bash -c 'test $(date +%u) -lt 6 && slack'
工作日会正常启动slack,周末则不会有任何动作。确认没问题后,把配置加到i3的~/.config/i3/config里,按$mod+Shift+r重启i3就生效了。
内容的提问来源于stack exchange,提问作者ffigari




