背景:我使用 Tilix 作为我的主要终端模拟器。在 Tilix 首选项(附截图)中,我已将其设置为当 Tilix 启动时,它将运行以下命令:
/usr/bin/zsh -c "if [[ $(tmux ls 2>/dev/null | grep -q -E '^main.*attached.*'; echo $?) -ne 0 ]]; then tmux attach -t main || tmux new -s main; else /usr/bin/zsh; fi"
这会检查:
- 如果名为的 tmux 会话
main
正在运行并且附加了一个窗口- 如果失败,它将尝试附加到名为的 tmux 会话
main
- 如果失败,那么它将继续创建一个名为 的新 tmux 会话
main
并附加到它
- 如果失败,那么它将继续创建一个名为 的新 tmux 会话
- 否则(如果成功),只需启动普通
zsh
- 如果失败,它将尝试附加到名为的 tmux 会话
所有这些复杂性的原因是,当我第一次启动 tilix 时,它将在 tmux 运行并连接到它的情况下启动它。任何新的 tilix 会话或者新的 tilix 窗口lauched 不会创建或尝试连接到名为 main 的现有 tmux 会话。 (Tilix 有自己的多窗口和窗格,不要与 tmux 会话混淆)
我想知道是否可以压缩上面的代码块,或者是否可以提出上面代码块的更好版本。
答案1
命令替换有点过头了,但除此之外看起来还不错。直接使用退出代码即可if
如果^main.*attached.*
找到了该模式,那么该模式^main.*attached
也将被发现,同样,如果未找到较长的模式,则较短的也不会找到。较短模式的匹配可能会更快。
/usr/bin/zsh -c "if ! tmux ls 2>/dev/null | grep -q -E '^main.*attached'; then tmux attach -t main || tmux new -s main; else /usr/bin/zsh; fi"
答案2
如果你的 tmux 足够新,你可以这样做:
[ "$(tmux display -pt=main: '#{session_attached}' 2>/dev/null)" -gt 0 ] && exec tmux new -Asmain || exec zsh