tmux,終端複用神器,之前我一直用byobu,它是tmux的封裝,我看了一下源代碼,其實就是一堆的bash腳本+python腳本。因爲一些 byobu的bug,我選擇使用原生tmux,但是有一個問題,就是以前執行tmux的時候,是在 ~/.bashrc 里加上:

# start tmux
if [[ -z "$TMUX"  ]] && [ "$SSH_CONNECTION" != ""  ]; then
   tmux attach || tmux new
fi

意思就是,當檢測到當前是ssh連接並且當前沒有使用tmux時,就執行 tmux attach || tmux new ,這樣就會優先選擇連接到上次的 會話,如果沒有,那就創建一個新的會話,這樣的確也能運行,能在ssh登錄時自動運行tmux,但是有一個比較麻煩的缺點,那就是 退出時,由於它是使用一個子進程來執行 tmux attach || tmux new ,因此即使退出,我們還是會回到一個沒有tmux的連接,也就是說, 我們需要退出兩次。解決方案就是寫一個腳本,實現和 tmux attach || tmux new 一樣的功能,但是使用bash內置的exec替換當前進程 的代碼,我用python來實現的:

#!/usr/bin/env python3

import os
import sys
import subprocess


def get_sessions():
    sessions = []

    output = subprocess.Popen(["tmux", "list-sessions"], stdout=subprocess.PIPE).communicate()[0]
    if sys.stdout.encoding is None:
        output = output.decode("UTF-8")
    else:
        output = output.decode(sys.stdout.encoding)
    if output:
        for s in output.splitlines():
            # Ignore hidden sessions (named sessions that start with a "_")
            if s and not s.startswith("_"):
                sessions.append(s.strip())
    return sessions


sessions = get_sessions()
if sessions:
    session_name = sessions[-1].split(":")[0]
    os.execvp("tmux", ["tmux", "attach", "-t", session_name])
else:
    os.execvp("tmux", ["tmux", "new"])

然後把 ~/.bashrc 改成這樣的:

# start tmux
if [[ -z "$TMUX"  ]] && [ "$SSH_CONNECTION" != ""  ]; then
    exec ~/.xmonad/bash/tmux.py
fi

注意,要把上面的 ~/.xmonad/bash/tmux.py 替換成你保存 tmux.py 這個腳本的路徑,而且記得要給 tmux.py 這個腳本加可執行權限 chmod +x tmux.py

完美!

相關文章