Kabuk isteminde kısaltılmış geçerli dizin?


23

vim biraz uzunken yollarında kullandığı gerçekten hoş bir özelliğe sahip:

görüntü tanımını buraya girin

Üstteki sekmedeki belgeye giden yolu kısaltır. Buna benzer bir şey yapmanın bir yolu var mı, bu yüzden bash istemim şöyle görünmüyor:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
Demek istediğin ne rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? İdeal olarak, maksimum bilgi istemi uzunluğu için bazı eşikleri kullanmak?
nicerobot

Kesinlikle, aradığım şey bu.
Naftuli Kay

Tamam, cevabımı verdim.
nicerobot

Yanıtlar:


14

Deneyin bu :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

veya saf bash:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

sonra

PS1='\u@\h ${PS1X} $ '

(fark üretir ~için ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

@ Enzotib'in sayesinde cevabımı geliştirdim


1
Bunun gelecek için bir neye benzeyeceğini gösteren bir örnek verebilir misiniz?
Naftuli Kay

(0) Github bağlantınız koptu. (1) $PWD~teste daha yakından bakmak isteyebilirsiniz . Eğer Halen HOMEolduğunu /home/edve PWDolup /home/edwina, Alacağınız ~winaPerl sürümünde ve ~/inakabuk versiyonu. (2) Geçerli dizinde herhangi bir joker karakter (yol adı genişletme) karakterler içeriyorsa, kabuk kodunuz boğulur; örneğin, PWD= /abc/*/def. Ekleyerek bu sorunu giderebilirsiniz set -o noglobya set -f. … (Devam Ediyor)
G-Man 'Monica'yı Yeniden Girin'

(Devam ediyor)… (3) Neredeyse çok fazla ayraç kullanmanıza gerek yok. Perl komutunda $HOME(çift tırnak içindedir) ve $PWDyeterince iyidir. Kabuk komutu, son üç kabuk değişkeni referanslar iyidir, ancak ilk üç olabilir "${PWD#$HOME}", "$PWD"ve "$p". (4) Ayrıca bkz. Mbentley'nin cevabı ve yorumlarım.
G-Man,

15

@Nicerobot answer benzer, ancak biraz daha kısa:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Bu, takip eden örnek çıktıyı gösterecektir:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

Ben PROMPT_DIRTRIMbash severim ...

export PROMPT_DIRTRIM=2

örnek istemi ... olarak değiştirecek

rfkrocktk@work-laptop ../com/tkassembled/ $

Benim için çalışıyor.


İstediğini yapmaz, ama beni bu özellikten haberdar ettiğin için teşekkürler.
nicerobot

3
@nicerobot Evet, gerçek cevabı aldınız. :) Onun istediği kısaltmayı vermediğini biliyorum, fakat genellikle basit seçenekleri gördüğümüzde beklentilerimiz değişir. Ayrıca, standart ve böyle bir söz hak ettiğini hissettim.
BentFX

1
SE'nin işlevlerinden birinin, sadece soruya kusursuz bir cevap vermek değil, aynı zamanda OP'yi ve soruyu arama yoluyla bulan diğer kişilere de başka seçenekler sunmak olduğunu hissediyorum. Verdiğim cevap bağlamına dikkat edin: "Seviyorum ... benim için çalışıyor." Yine de bazıları aşağı oylamayı hak ettiğine inanıyor.
BentFX

Doğrudan soruya cevap vermeyen cevapların oylandığını görmeye meyilliyim, ancak alternatifler sunmanın geçerli bir cevap ya da cevap olabileceği konusunda size katılıyorum .
nicerobot

BentFX'in cevabı OP'nin sorusunu bir bütün olarak cevaplamıyor, tam olarak konuyu cevaplıyor mu? Bu, muhtemelen bu konunun ziyaretçilerinin çoğu için tam olarak aradıklarını.
TNT

4

Üzerine ekleme enzotib aşağıdaki pasajı olacak cevap s':

  1. Dönüştürme /Path/To/Your/Home/için ~/(bir yol olacak böylece ~/a/b/cyerine /P/T/Y/H/a/b/c)
  2. Yalnızca nokta ( /a/./c/dolacak /a/.b/c/d) göstermek yerine 'nokta dosyasının' ilk harfini kullanın :

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Tek tırnak kullandığınızdan emin olun, aksi halde bash onu önceden genişletir.


3

Senin kullanılmak üzere biçim PS1DİR \W(bkz PROMPTINGbölümüne bashadam sayfası).

PS1="\u@\h \W\$ "

Ve oradaki diğer seçenekleri okumak isteyebilirsin, komut satırınla ​​harika şeyler yapabilirsin.


2
Sanırım istediği şeyi hiç yapmıyor.
nicerobot

1
@nicerobot Yolun her bileşeninin ilk baş harfini vermez, ancak geçerli çalışma dizinini daha kısa bir şekilde verir. Her istemde yürütülen oldukça çirkin bir betik kullanmadan dizini bu şekilde kısaltmanın mümkün olmadığından eminim. Bu konuda ne söyleyeceğini göreceğiz.
Kevin,

1

Nicerobot örneğinin çıktısını seviyorum ama bir sorun buldum. İçinde kısa çizgi olan bir dizin var A-Eve o anki çalışma dizinim olduğunda -Ebir argüman olarak görüyordu printf. Bunu düzeltmek --için, printfçıkacak bir şey olmaması durumunda çıktıya en son alıntıları ekledim:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1) -İkinci karakter olarak içeren dizin isminin iyi anlaşılması . Başlayan --argümanlar sorununun genel çözümü olduğu doğru olsa da -, bunun için daha iyi bir yöntem , bunun da içeren argümanlara karşı koruduğunu printfsöylemektir . (Örneğin, deneyin = . (2) Ayrıca nicerobot'un cevabı hakkındaki yorumlarıma da bakın.printf "%s" "${q:1}"%PWD/home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def
G-Man 'Monica'yı Yeniden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.