【问题标题】:customize linux shell prompt自定义 linux shell 提示符
【发布时间】:2012-02-03 07:13:55
【问题描述】:

在我的.bashrc 中,我得到了这个:

PS1="[\w $]"

而且每次我cd到一个很深的目录时,shell提示符几乎占满了整行,(终端大小:80*24),比如:

[/level_a_dir/level_b_dir/level_c_dir/level_d_dir/level_e_dir $]

问题

如果pwd 超过 20 个字符,我想缩短提示,只需保留最后一个目录,例如:

[.../level_e_dir $]
#[/level_a_dir/level_b_dir/level_c_dir/level_d_dir] is replaced with ...

怎么做?

【问题讨论】:

  • Bash 已经为此提供了\W 提示符转义。
  • 还有PROMPT_DIRTRIM,但这并不是你想要的。

标签: bash prompt


【解决方案1】:

我是通过以下方式完成的。
首先你必须创建一个shell脚本,truncate.sh:

#!/bin/bash
MAXLEN=20
REPLACEMENT="..."

# replace /home/user by ~
TPWD=$(echo ${PWD} | sed 's#'${HOME}'#~#;')

# truncate
if [ ${#TPWD} -gt ${MAXLEN} ] ; then
  PWDOFFSET=$(( ${#TPWD} - ${MAXLEN} ))
  TPWD="${REPLACEMENT}${TPWD:${PWDOFFSET}:${MAXLEN}}"
fi

echo ${TPWD}

接下来你必须更换你的 PS1:

export PS1="[\$(truncate.sh) ] "

【讨论】:

  • 每次裁剪新提示时,truncated.sh 都会执行一次,对吗?是我吗,如果我只是在命令行中简单地按下Entertruncated.sh 就会被执行?
  • @Alcott 对不起,我不明白你的问题。每次生成新提示时(命令完成后或Enter 后)都会执行 truncate.sh。
  • 你说得对,:-)。你能解释一下sed 's#' ${HOME} '#~#;'吗,我不太明白。
  • @Alcott ${HOME} 包含您的主目录 (/home/alcott)。为了节省一些字符,我将其替换为~。这意味着:/home/alcott/Documents 变为 ~/Documents。 (类似:sed 's#/home/alcott#~#;';语法:sed 's#pattern#replacement#;'
  • 您可以使用 case $PWD in ${HOME}/*) PWD='~'"${PWD#$HOME}";; esac 完全使用 shell 内置插件进行替换。
【解决方案2】:

如果您真的想要 20 个字符,无论可能是(或更少),那么我能想到的最简单的是:

export PS1='[${PWD:$((${#PWD}-20))} $]'

如果您没有太多空间或考虑使用两行提示符,我会去掉括号(我个人讨厌 :-)

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 2019-07-25
    • 2016-06-24
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多