# 设置screen窗口标题,这个方式不依赖screenrc中的shelltitle if [ -n "$STY" ]; then# 仅在 screen 中生效 # 获取后台作业命令 __get_fg_cmd() { local job_id if [[ "$*" =~ ([0-9]+) ]]; then job_id="${BASH_REMATCH[1]}" else job_id="%+" fi jobs"$job_id" | awk '{$1=$2=""; sub(/^ */, ""); print}' }
__get_vim_cmd() { local input="$*" if [[ $input =~ [[:space:]]+([^-][^[:space:]]*) ]]; then local name="${BASH_REMATCH[1]}" name=$(basename "$name") printf'[vim]%s'"$name" else printf"vim" fi }
__get_cmd() { local i local _command local _sudo=0 _command="$BASH_COMMAND" for i in {0..4}; do # 清除前缀空格 _command="${_command#"${_command%%[![:space:]]*}"}" case "$_command" in "fg"|"fg"*) _command=$(__get_fg_cmd $_command) ;; "vim"|"vim "*) _command=$(__get_vim_cmd $_command) # vim不继续处理 break ;; "sudo "*) # sudo 删除 _command=$(printf '%s' "$_command" | awk '{$1=""; sub(/^ /, ""); print}') _sudo=1 ;; *) # 提取命令名 _command=$(printf '%s' "$_command" | awk '{print $1}' | sed 's#^.*/##') # 跳出循环 break ;; esac # 循环结束未提取完 if [ $i -eq 4 ];then # 提取命令名 _command=$(printf '%s' "$_command" | awk '{print $1}' | sed 's#^.*/##') fi done if [ $_sudo -ne 0 ];then printf '#%s' "$_command" else printf '%s' "$_command" fi } # 设置标题函数 __set_screen_title() { local cmd=$(__get_cmd) if [ x${cmd} != x ];then printf "\033k${cmd}\033\134" fi } # 设置触发器 trap '__set_screen_title' DEBUG # 一些发行版会使用PROMPT_COMMAND改变终端窗口标题,保留原ANSI序列。增加返回screen默认标题bash if [ "x$PROMPT_COMMAND" == "x" ];then PROMPT_COMMAND="printf'\033kbash\033\134'" else PROMPT_COMMAND="$PROMPT_COMMAND;printf'\033kbash\033\134'" fi fi