2016-05-27 37 views
5

tcsh'dan bash'a yeni taşındım ve özellikle %c02 (ellipsis da ayarlanmış) kullanarak dizin kısaltma istemi seçeneklerini özledim.Bash komut istemi kısaltması

PROMPT_DIRTRIM'un hemen hemen doğru olanı olduğunu görüyorum (elips, bence hariç) ancak sadece bash 3 (OS X'de). Toplam uzunluğu kısaltan this recipe elsewhere on SO'u buldum, bu yüzden beğenmediğim dizinlerin ortasındaki yol adlarını kırarım.

yüzden bu geldi:

PROMPT_DIRTRIM=2 ## from bash4, but used here 
dirtrim() 
{ 
    local NAME="$1" start= endelts= 
    [[ "$NAME" =~ ^"$HOME"(/|$) ]] && NAME="~${NAME#$HOME}" ## $HOME ==> ~ 
    IFS=/ read -ra elts <<< "$NAME";   ## split $PWD on "/" 
    start=$((${#elts[@]}-${PROMPT_DIRTRIM})) ## first element to retain 
    if [ ${start} -gt 1 ]; then  
     for ((i=${start}; i<${#elts[@]}; i++)); do 
      endelts="${endelts}/${elts[$i]}"; ## concat together the trailing path 
     done 
     NAME="...${endelts}" 
    fi 
    echo "$NAME"  
} 
PS1='\h:$(dirtrim "$PWD")\$ ' 

Çalışıyor:

blackat:~$ cd ~/Library/Application\ Support/Apple 
blackat:.../Application Support/Apple$ 

Ama açık for (()) döngü ile bash için yenice ve mutsuz değilim; ancak, bölünmüş elts dizisinin son girişlerine, dir adlarındaki boşluklarla doğru bir şekilde ilgilenen başka bir yol bulamadım (ör. ${elts[@]:${start}} kullanarak). Bunu veya diğer iyileştirmeleri yapmak için herhangi bir ipucu var mı?

+1

Bash bir programlama dilidir. –

+0

@Jonathan Leffler: Anlaştık - bu, kapanmak için iki oya karşılık oldu! –

+2

Ve Bash programlama ile ilgili soruların programlama soruları olduğunu ve bu nedenle de Stack Overflow'da konu olduğunu onaylıyorum. Kabuk programlama ile ilgili konu dışı konuyla ilgili soruları kapatmak önemli bir problemdi; bu günlerde, bunun gerçekleştiğini görmüyorum, ama bu sadece onu kaçırdığım anlamına gelebilir ve her zaman olur.FWIW: Uzun istemleri sevmiyorum: Yolculuğu hiçbir şekilde istemiyorum. Bir makinede 'sfenks' istemi 'Sphinx JL: 'dir. Mac terminali ile, terminal başlık çubuğunda yolunuzu bulabilirsiniz (Özellikler -> Pencere ve Başlık bölümüne bakın). –

cevap

3

Bunu deneyebilirsiniz (Bu arada, .... bu bash bir programlama dilidir ölçüde bir programlama sorusu, olduğunu düşünüyorum):

if ((start > 1)); then 
    name=$(IFS=/; echo .../"${elts[*]:start}") 
    # If your terminal is correctly set up for unicode, you can save two character positions: 
    # name=$(IFS=/; echo …/"${elts[*]:start}") 
fi 

Not bash içinde, ((...))'un iç kısmını ve dizi aboneliklerini içeren aritmetik bir bağlamda, yalnızca değişkenin adını yazabilirsiniz; sigillere gerek yok.

dirtrim() { 
    local path="$1"; 
    [[ $path =~ ^"$HOME"(/.*)? ]] && path=~${BASH_REMATCH[1]}; 
    ((PROMPT_DIRTRIM)) && 
    [[ $path =~ ...*((/[^/]*){$PROMPT_DIRTRIM}) ]] && 
    path=…${BASH_REMATCH[1]}; 
    echo "$path" 
} 

((PROMPT_DIRTRIM)) testi tamamen değil:

başka yolu da dize yerine bölünme daha BASH_REMATCH dizideki regex yakalar kullanarak ve rejoining, bu

if ((start > 1)); then 
    printf -v name "/%s" "${elts[@]:start}" 
    name=...$name 
fi 

olurdu Yine başka bir çözüm yapmak Aritmetik bir bağlamda bash değerlendirmesinin özellikleri nedeniyle sağlamdır. dağıtım için gerçekten [[ $PROMPT_DIRTRIM =~ ^[1-9][0-9]*$ ]]

+0

1. Gövde hakkında; [Başka bir cevap] 'dan NAMES' aldım (http://stackoverflow.com/a/1618602/12266). 2. Ben ((start> 1)) 'demek istedim - eğer başlangıç ​​== 1' sadece ilk girişi tutuyorsanız; 3. Bence * sen * demek istedin * isim = $ (IFS = /; echo .../"$ {elts [*]: start}") '(nb.' IFS =/'ve' '' '' 'dır) –

+0

@andrew: Bir bash dizisinin ilk girdisi 0 dizinine sahiptir. Yazım hataları hakkında haklısınız, ben bunu yazdığımda kapıdan dışarı fırlıyordum. Üzgünüm, şimdi tamir ettim. – rici

+0

evet, ama sıfır giriş "~" veya null, bu yüzden gerçekten sadece "start> 1" –

1

Sorumun cevabı değil gibi bir şey tercih olabilir, ama nasıl mksh bakmak isteyebilirsiniz başarmaktadır: Maalesef

PS1=${| local e=$? ((e)) && REPLY+="$e|" REPLY+=${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo \?)} [email protected]${HOSTNAME%%.*}: local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~} local m=${%d} n p=...; ((m > 0)) || m=${#d} ((m > (n = (COLUMNS/3 < 7 ? 7 : COLUMNS/3)))) && d=${d:(-n)} || p= REPLY+=$p$d return $e } 

, benim, bash olmayan bazı uzantılarını kullanır inanıyoruz.

Aso, mermileri değiştirdiğiniz için ... fish'u düşündünüz mü?

Bu kutudan çıkar çıkmaz ve sonra da bazıları.