tmux使用

参考教程: https://www.ruanyifeng.com/blog/2019/10/tmux.html
  • tmux使会话与窗口解绑,一个窗口source .bashrc更新了,另一个窗口可能没有
  • ctrl+b 前缀键
    % 分成左右两栏
    " 分成上下两栏
    up 选择上边的窗口
    [ 查看历史记录

窗口

  • <C-d> 删除窗口
  • <C-b> z 最大化/最小化一个窗口
  • <C-b> c 创建一个新的窗口,使用 <C-d>关闭
  • <C-b> N 跳转到第 N 个窗口,注意每个窗口都是有编号的
  • <C-b> p 切换到前一个窗口
  • <C-b> n 切换到下一个窗口
  • <C-b> w 列出当前所有窗口

Tmux-Path 双向绑定

使用tmux会存在一个问题:在1个窗口设置了环境变量,在其他窗口并不会生效。
下面的脚本会帮助我们解决问题,它将tmux白名单内的全局变量值自动同步到Shell环境变量。

  1. 首先,编写~/.tmux.conf白名单。以NACOS为例:
    参考教程(zsh):https://manselmi.github.io/notes/tmux-env-var-sync/
# https://www.mankier.com/1/tmux#Options
# https://www.mankier.com/1/tmux#Global_and_Session_Environment
set-option -g update-environment \
'DISPLAY KRB5CCNAME SSH_AGENT_PID SSH_ASKPASS SSH_AUTH_SOCK SSH_CLIENT SSH_CONNECTION SSH_TTY \
SSH_USER_AUTH WINDOWID XAUTHORITY \
NACOS_USERNAME NACOS_PASSWORD \
'
  1. 接着编写~/.bashrc同步脚本,下面的脚本兼容了自动打开tmux操作。
# tmux environment management for bash
# This ensures environment variables are synced between tmux sessions and doesn't interfere with non-interactive sessions

tm() {
local SESSION_NAME="${1:-default}"
shift
tmux new-session -AD -s "$SESSION_NAME" "$@"
}

tmux_global_update_var() {
local VAR="$1"
local VALUE

if [ $# -ge 2 ]; then
VALUE="$2"
else
if [[ -v ${VAR} ]]; then
VALUE="${!VAR}"
else
tmux set-environment -gru -- "$VAR" >/dev/null 2>&1
return
fi
fi

tmux set-environment -g -- "$VAR" "$VALUE" >/dev/null 2>&1
}

tmux_shell_update_var() {
local VAR="$1"
local TMUX_OUTPUT
local TMUX_ERROR_CODE

if TMUX_OUTPUT=$(tmux show-environment -gs -- "$VAR" 2>/dev/null); then
eval "$TMUX_OUTPUT"
else
unset "$VAR"
fi
}

tmux_update_environment() {
command -v tmux >/dev/null || return

local VARS=($(tmux show-options -gv update-environment))

if [[ -z "$TMUX" ]]; then
tmux has-session >/dev/null 2>&1 || return
for var in "${VARS[@]}"; do
tmux_global_update_var "$var"
done
else
for var in "${VARS[@]}"; do
tmux_shell_update_var "$var"
done
fi
}

PROMPT_COMMAND="tmux_update_environment${PROMPT_COMMAND:+; $PROMPT_COMMAND}"

# 自动附加tmux会话(仅在交互式SSH会话中生效)
if command -v tmux &>/dev/null && [[ -n "$SSH_CONNECTION" && -z "$TMUX" && $- == *i* ]]; then
if tmux has-session -t default 2>/dev/null; then
exec tmux attach -t default
else
exec tmux new -s default
fi
fi
  1. 设置tmux全局变量,自动同步到所有窗口Path
tmux set-environment -g NACOS_USERNAME "nacos"

echo $NACOS_USERNAME
# 应该输出nacos,并且在所有窗口生效