2012-02-03 16 views
2

在我.bashrc,我得到這個:定製Linux shell提示符

PS1="[\w $]" 

而且每次當我cd與深層次的一個目錄,在shell提示符幾乎佔據了整條生產線,(終端尺寸時間: 80 * 24),如:

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

問題

我希望削減提示短,如果pwd我s長於20個字符,只是保留最後一個dir,如:

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

如何做到這一點?

+1

Bash已經提供了'\ W'提示轉義爲此。 – tripleee 2012-02-03 09:44:35

+0

@tripleee,好的。 – Alcott 2012-02-03 10:03:01

+0

還有'PROMPT_DIRTRIM',但這不正是你所要求的。 – 2012-02-03 16:50:41

回答

2

我已經用下面的方法完成了。
首先,你必須創建一個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) ] " 
+0

每次出現新的提示時,'truncated.sh'都會執行一次,對吧?是否我,如果我只是簡單地將'Enter'推入命令行,'truncated.sh'會被執行? – Alcott 2012-02-03 07:41:09

+0

@Alcott對不起,但我不明白你的問題。每次產生一個新的提示時(在一個命令完成之後或者在一個'Enter'之後)truncate.sh將被執行。 – sgibb 2012-02-03 07:52:25

+0

你說得對,:-)。你能否解釋一下'sed'#'$ {HOME}'#〜#;'',我不太明白。 – Alcott 2012-02-03 08:01:17

0

如果你真的想只是 20個字符whetever可能是(或更少),那麼最簡單的我能想到的是:

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

如果你沒有h,我會刪除括號很多空間或考慮有一個兩行提示(我個人討厭:-)