如何在Bash中用jq解析i3可见工作区并保存恢复?
解决i3窗口管理器恢复可见工作区的问题
问题原因分析
你之前的jq命令输出带引号的JSON数组,是因为表达式map(select(.visible == true)).name返回的是JSON数组对象,-r参数只对单个字符串值生效,无法去掉数组整体的引号和方括号。
正确步骤
1. 正确获取无引号的可见工作区名称
用以下命令逐个输出每个可见工作区的名称(每行一个,无引号):
i3-msg -t get_workspaces | jq -r '.[] | select(.visible == true) | .name'
解释:
.[]:遍历JSON数组中的每个工作区对象select(.visible == true):筛选出可见的工作区.name:提取工作区名称-r:这里针对单个字符串值生效,输出纯文本不带引号
2. 将结果存入Bash数组
用循环读取输出存入数组,避免工作区名称含空格时出错:
local currentWorkspaces=() while IFS= read -r ws; do currentWorkspaces+=("$ws") done < <(i3-msg -t get_workspaces | jq -r '.[] | select(.visible == true) | .name')
3. 恢复可见工作区
i3的workspace命令每次只能切换一个工作区,多显示器场景下逐个设置即可:
for ws in "${currentWorkspaces[@]}"; do i3-msg workspace "$ws" done
也可以把所有命令合并成一个传给i3-msg,减少进程调用:
i3-msg "$(printf 'workspace "%s"; ' "${currentWorkspaces[@]}")"
内容的提问来源于stack exchange,提问作者Jameson Bradfield
相关产品推荐
相关产品推荐

