在启动 session 之前在函数中自定义 linux 终端 PS1 变量

Customize linux terminal PS1 variable in a function before starting a session

我经常从终端的不同选项卡启动一个终端 session 到服务器。我想创建一个函数,在启动 session 之前更改选项卡的标题,以便我可以轻松识别哪个选项卡打开了哪个 session。

让我们假设我的 session 是一个 ssh session。当我输入终端

fn myserver

其中 fn 是在 ~/.bashrc 中定义的函数:

function fn() {
  set-title ""
  ssh          
}
function set-title() {
  if [[ -z "$ORIG" ]]; then
    ORIG=$PS1
  fi
  TITLE="\[\e]2;$*\a\]"
  PS1=${ORIG}${TITLE}
}

终端启动 session 并且选项卡的标题仅在 ssh session 结束后更改。我猜这是因为 session 在 fn 函数中打开,并且只有当函数 returns 被 PS1 实现时。如何在 session 开始之前更改 title/update 和 PS1 变量?

你是对的;将 TITLE 添加到 PS1 后,您的本地主机不会显示另一个提示,直到 ssh 退出。相反,立即输出 TITLE

function fn() {
  set-title ""
  ssh          
}
function set-title() {
  printf '\e]2;%s\a' ""
}

请注意,在 运行 ssh 之前在本地设置 PS1 无论如何都不会影响您在远程主机上的提示。

使用 answer 中的详细信息,我想出了这个:

function set-title() {
  if [[ -z "$ORIG" ]]; then
    ORIG=$PS1
  fi
  TITLE="\[\e]2;$*\a\]"
  PS1=${ORIG}${TITLE}
}

function fn() {
  set-title 
  ssh -t  "bash --init-file <(echo \"export PS1=\\"$ORIG$TITLE\\"\")"
}

您可能必须在导出 PS1 之前获取您的 .bashrc 文件,因为 --init-file 使 bash 忽略初始化文件。 (出于某种原因我不需要...)。那么你应该用 echo \"cd $HOME; . .bashrc; export PS1=\\"$ORIG$TITLE\\"\"

替换 echo \"export PS1=\\"$ORIG$TITLE\\"\"