0

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

让我们假设我的会话是 ssh 会话。当我输入终端

fn myserver

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

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

终端启动会话,并且仅在 ssh 会话结束后更改选项卡的标题。我猜这是因为会话在 fn 函数中打开,并且只有当函数返回时 PS1 才会实现。如何在会话开始前更改标题/更新 PS1 变量?

4

2 回答 2

1

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

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

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

于 2016-06-23T19:23:50.840 回答
1

使用这个答案的细节,我想出了这个:

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

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

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

于 2016-06-23T20:10:44.863 回答