tmux:使用“set -g status-right”设置时,用户名不会在状态栏中更新?

tmux:使用“set -g status-right”设置时,用户名不会在状态栏中更新?

我想在状态的右侧显示用户名,tmux并在使用例如更改用户时自动更新它sudo -u

我尝试使用以下方法实现此目的#(whoami)

set -g status-right "#{?window_bigger,[#{window_offset_x}#,#{window_offset_y}] ,} #[fg=colour47]#(whoami) %H:%M %d-%b-%y"

此外,我将更新间隔设置为2秒:

set -g status-interval 2

但是,当使用例如更改用户时sudo -u,状态栏不会更新用户名,但时间会不断更新:

在此处输入图片描述

每当我更改用户时,如何更新tmux用户名?

答案1

你实际上不是改变整个环境的用户。您只是打开了一个以“root”身份运行的新 shell,但它的父 shell 仍然在您的帐户下,主“tmux”进程也是如此。Tmux 几乎不知道该 shell 内部发生了什么。

运行该whoami命令时,进程树如下所示:

tmux server              [nlykkei]
└─ bash                  [nlykkei]
   └─ sudo -u root bash  [setuid root]
      └─ bash            [root]
         └─ whoami       [root]

当 tmux 需要扩展时#(whoami),它会采用最简单的方法并直接运行命令。(它实际上无法通过您启动的三重嵌套 shell 运行该命令。)因此输出始终反映拥有“tmux”服务器进程的帐户。

tmux server              [nlykkei]
├─ bash                  [nlykkei]
│  └─ sudo -u root bash  [setuid root]
│     └─ bash            [root]
└─ whoami                [nlykkei]

不幸的是,我想不出一个好的方法将信息从嵌套 shell 实际导出到 tmux。已经有#{pane_title}#{window_name},它们都可以使用转义码进行设置,但它们当然已经有不同的用途。

一种方法是可能工作是:

tmux set -g status-right '#(ps -o user= -q $(pgrep -t #{s/^.dev.//:pane_tty} -x -n bash))'

tmux set -g status-right '#(ps -t #{pane_tty} -o user= --sort start | tail -1)'

相关内容