Bash isteminde yalnızca geçerli ve üst dizini göster


16

Bash için yeniyim ve istemim tcsh'de önemsiz bir şey göstermek istiyor, ancak iyi bir google aramasından sonra hala yapamıyorum.

Ben sadece böyle güncel ve üst dizinleri dahil istemi istiyorum:

/parent/currentdir $

Tcsh'de bu şu şekilde sağlanır:

set prompt = "%C2 %"

Ancak bash şimdiye kadar ben sadece aynı çıktı elde etmek için pwd ayrıştırmak zorunda bulduk.

Yapmanın daha basit bir yolu yok mu?

export PS1="$(some_command) $" 

2
Teorik olarak, PS1='\w \$'; PROMPT_DIRTRIM=2size bash eşdeğerini vermeli, ancak bu benim sistemimde düzgün çalışmıyor.
Mikel

Benimkinde hiç çalışmıyor: GNU bash, sürüm 3.2.57 (1) -çalışma (x86_64-apple-darwin14).
twalbaum

PROMPT_DIRTRIMBash 4'te tanıtıldı . WSL altında Ubuntu 16.04 üzerinde test yaptım ve harika çalıştı!
Mike Branski

Yanıtlar:


18

Bash'in hızlı kontrol özellikleri oldukça statiktir. Daha fazla denetim istiyorsanız, isteminize değişkenler ekleyebilirsiniz; promptvarsseçeneği kapatmadığınızdan emin olun .

PS1='${PWD#"${PWD%/*/*}/"} \$ '

Tek tırnaklara dikkat edin: Değişken açılımları, PS1değişkenin tanımlandığı zamanda değil, bilgi isteminin görüntülendiği sırada gerçekleşmelidir .

Görüntülenenler üzerinde daha fazla kontrol istiyorsanız, komut ikamelerini kullanabilirsiniz. Örneğin, yukarıdaki pasaj ~, giriş dizininin kısaltmasını kaybeder .

PS1='$(case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac; printf %s "$HPWD") \$ '

Bu kod oldukça hantaldır, bu nedenle PS1değişkeni içine yapıştırmak yerine, kodu çalıştırmak ve sonra bunu isteminizde kullanmak için PROMPT_COMMANDdeğişkeniHPWD kullanabilirsiniz.

PROMPT_COMMAND='case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac'
PS1='$HPWD \$'

Kısaltılmış bilgi istemi yalnızca bir dizin değişikliğinde değiştiği için, bir bilgi istemi her görüntülendiğinde yeniden hesaplamanız gerekmez. Bash, geçerli bir dizin değişikliğinde çalışan bir kanca sağlamaz, ancak onucd ve kuzenlerini geçersiz kılarak simüle edebilirsiniz .

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  case $PWD in
    $HOME) HPWD="~";;
    $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    $HOME/*) HPWD="~/${PWD##*/}";;
    /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    *) HPWD="$PWD";;
  esac
}
PS1='$HPWD \$'

PS1Bir ortam değişkeni değil, bir kabuk ayarı olduğundan dışa aktarmanız gerekmediğini ve dışa aktarmamanız gerektiğini unutmayın . Bir bash PS1ayarı diğer mermiler tarafından anlaşılamazdı.

PS Eğer güzel bir interaktif kabuk deneyimi istiyorsanız , tüm bunların ( büyük ölçüde tcsh'leri kapsayan istem genişletmeleri , vb.) Zsh'a geçin .%chpwd

PS1='%2~ %# '

2
Bu kabul edilmiş ve en çok onaylanmış cevap olmalıydı.
LarsH

3

Ebeveyn ve mevcut dizinleri elde etmek için sözdizimi Munai en alınır cevap .

Bununla birlikte, Gilles tarafından belirtildiği gibi, bu kod sadece .bashrcyüklendiği sırada geçerli dizini gösterir , ancak sistem diğer klasörlere gittiğinizde değişmez.

Bunun .bashrcdosyanızda bulunması, istemin otomatik olarak geçerli dizininize güncellenmesini sağlar:

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command

1
Tanımlamanın prompt_command()kendi başına bir şey yapması gerekiyor mu? Benim için değil. Gilles'in yaptığı gibi & prompt_command()co'nun yeniden tanımlarında da kullanmak istediniz cdmi? Yoksa bunu mu demek istediniz PROMPT_COMMAND='...'?
LarsH

2
Ayrıca, $PWDboşluk bulunduğunda bu komut başarısız olur .
LarsH

1
Beni buna geri getirdiğin için teşekkürler. Boşluklara izin vermek için $ PWD'lerden alıntı yaptı ve son komutu dahil etti. Şu anki istemim bundan daha karmaşık, bu yüzden prompt_command tanımına olan ihtiyaç. Aksi takdirde, PS1 = ... üzerinde çalışır.
twalbaum

Gitirken çıktıyı temizlemek için herhangi bir fikir var /mı? Yazılı olarak, olsun/// $
ezrock

0

Bilgi istemi dizesi bashkabuk değişkeni düzenlenerek kolayca değiştirilebilir PS1. Istemi Dize 1 anlamına gelir. Daha fazla bilgi burada .

Şimdilik bashkabuğunu ateşle .

vi ~/.bashrc

PS1 tanımını dosyaya ekleyin

`export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"`

Daha fazla ince ayar yapmanıza yardımcı olmak için burada ve burada daha fazla öğretici .


1
Bilgi isteminin nasıl değiştirileceğini anlıyorum. Benim sorum, tüm yolu değil, yalnızca geçerli ve üst dizinleri nasıl alacağınızdır.
twalbaum

@twalbaum cevabımı düzenledi
Munai Das Udasin

@twalbaum :)
Munai Das Udasin

1
Bu .bashrc, bilgi yüklendiğinde istemi geçerli dizine ayarlar, cdbaşka bir dizine girerseniz bilgi istemi değişmez ! @twalbaum
Gilles 'SO- kötü olmayı bırak'

@Gilles benim için yapar.
twalbaum

0

Ana dizin için "~" ile daha basit olabilir.

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}

0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'

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.