bashプロンプトに現在のディレクトリ名のみを表示します(フルパスではありません)。


71

bashプロンプトの現在の設定方法では、現在のディレクトリへのパス全体が表示されます。プロンプトが非常に長くなり、すべてのコマンドが次の行に折り返されるため、ディレクトリツリーの奥深くにいると、これは面倒です。パスの最後の部分のみを表示するにはどうすればよいですか?

これは私が持っているものです.bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac

回答:


98

\w(小文字)を\W(大文字)に変更します。

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
                                                                                       ^^
           this one waaaaaay over here ------------------------------------------------+    

楽しい詳細については、Bash Prompt HOWTOをご覧ください。例:

user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

PROMPT_COMMAND変数は、設定されている場合、で指定されたプロンプトを表示する前に実行して取得するコマンドですPS1。あなたの場合、Xtermのタイトルバー操作する特定のANSIエスケープシーケンスでステートメントをPROMPT_COMMAND実行します。echo

プロンプトをPROMPT_COMMAND上書きしている疑いがある場合はPS1unsetそれを実行してテストします。

$ unset PROMPT_COMMAND

最後に、PS1実際に使用される定義を変更していることを確認してください。一般的な場所は/etc/bash.bashrc/etc/profile~/.bashrc~/.bash_profile~/.profile。システムファイルは通常(常にではありませんが)ユーザーファイルの前に実行されます。


うーん...すでに\ wになっているのではないかと思いcaseますが、xtermを使用しているときにそのステートメントがオーバーライドするようで、問題PWDPROMPT_COMMAND行にあるようです。私がそこに何を置くべきか知っていますか?
hsribei

4
\w(小文字)はフルパスに設定し、\W(大文字)は最終ビットにトリミングします。PROMPT_COMMANDは、xtermのウィンドウタイトルを設定しています。TERM変数を確認してください。それがいない場合は起動し、「xtermの」か「のrxvt」でPROMPT_COMMANDでも実行を取得されていません。
いんちきキホーテ

ああ、そうだね。申し訳ありませんが、大文字と小文字が混在しています。うまくいきました。ありがとう!:)
hsribei 2009年

素晴らしい答え。これを有効にするには、必ず再起動してください。ありがとう!
組み合わせる

14

単純なbash置換コマンドは

${VAR/pattern_to_find/pattern_to_replace}

最後のディレクトリを表示するには${PWD/*\//}、単に行うことができます。つまり、最後の ' /' を含む前のものを検索し、それを何も置き換えません。

私のubuntuマシンでは次を使用します:

export PS1='$(whoami):${PWD/*\//}#'. 

1
この回答は、$ PS1の特別な解析ロジックではなく、あらゆる状況に一般的であるため、受け入れられた回答よりも優れています。より強力なツールが少ないほど、覚えやすく、作成しやすくなります。:)
デビッドエリス

4

私の解決策は、5つ以上ある場合にトップ3とボトム2のディレクトリを表示することです

だから私のプロンプト(他の情報もあります)は次のようになります:

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote

私のpwdが実際に

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote

私のPS1プロンプトは次のようにセットアップされています。

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

git_branch は、現在のgitブランチを表示する関数です。ドットファイルに保存します。

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }

これはすごい!この答えをありがとう。
カルロスF

4

これに対する私のソリューションは、それをどのようにエクスポートするかに関してわずかに異なるので、ここでそれを共有すると思いました:

別のプロンプト文字列変数を作成します。PS5で、次の文字列を.profile/ .bash_profileファイルにエクスポートします。

\ u:現在のユーザー名を表示します。

\ W:現在の作業ディレクトリのベースを印刷します。

# Display username and current directory only.
export PS5='export PS1="\u:\W$";';

ショートハンドPSを使用する必要があるときはいつでも、次を実行します。 eval $PS5


または、さらに良いことに、.bash_aliasesファイルにエイリアスを作成します:(@muruに感謝)

alias PS5='export PS1="\u:\W$";';

source繰り返しますが、入力PS5するだけで切り替えることができます。


1
これはフランケニアのように見えます。エイリアスまたは関数を使用しないのはなぜですか?
ムル

1

bashプロンプトに現在のディレクトリ名のみを表示します(フルパスではありません)。

他のソリューションのほとんどは、ドットファイルを共有するすべてのOS(AIX、Windoze、Linux)で機能しませんでした。bashのポートは、特定の構造をサポートしていませんでした古いバージョンだったと私は別のプロセス(すなわちフォークしたくなかったsedawkcygwinの下に著しく高価である、など)。

以下は長いですが、パフォーマンスに優れています。

# takes a number argument of the number of last dirs to show
function DIR_LAST {
    # read -a didn't seem to work under bash 3
    IFS='/' array=($PWD)
    len=${#array[@]}
    start=$((len - $1))
    # leading / if fewer dir args: /usr/flastname not usr/flastname
    if (( $start <= 1 )); then
        start=1
        echo -n /
    fi
    for (( i = $start; $i < $len; i++ )); do
        if (( $i > $start )); then
            echo -n /
        fi
        echo -n ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

私はそれを吐き出したい:

/
/usr
/usr/foo
foo/bin

最後の行に先頭のスラッシュがないことに注目してください。また、argをに変更することにより、最後の3つのディレクトリを吐き出すことができますDIR_LAST

また、正規表現を使用してこれを実行しようとしましたBASH_REMATCHが、bash v3は括弧が好きではないようで、適切にエスケープする方法がわかりませんでした。はぁ。


0

このオプションは、次のことを行うだけではるかに簡単になると思います。

echo $PWD | rev | cut -d '/' -f 1 | rev

したがって、これを.bashrcファイルのPS1変数に割り当てます。

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'

0
root:~/project#  -> root:~/project(dev)# 

〜/ .bashrcの最後に次のコードを追加します

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.