web-dev-qa-db-ja.com

bashプロンプトに現在のディレクトリと親ディレクトリのみを表示する

私はbashを使い始めたばかりですが、tcshで簡単なことをプロンプトに表示させたいのですが、適切なgoogle検索を行ってもまだ実行できません。

次のように、プロンプトに現在のディレクトリと親ディレクトリのみを含めるようにしたいと思います。

/parent/currentdir $

Tcshでは、これは以下によって実現されます。

set Prompt = "%C2 %"

ただし、これまでのbashでは、同じ出力を取得するにはpwdを解析する必要があることがわかりました。

行うような簡単な方法はありませんか?

export PS1="$(some_command) $" 
16
twalbaum

Bashの プロンプトコントロール 機能はかなり静的です。さらに制御したい場合は、プロンプトに変数を含めることができます。 promptvarsオプション をオフにしていないことを確認してください。

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

単一引用符に注意してください。変数の展開は、PS1変数が定義されているときではなく、プロンプトが表示されたときに行われる必要があります。

表示内容をさらに制御したい場合は、コマンド置換を使用できます。たとえば、上記のスニペットは、ホームディレクトリの~の省略形を失います。

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

このコードはかなり扱いにくいので、PS1変数に固定する代わりに、 Prompt_COMMAND variable を使用してコードを実行し、HPWDを設定してから、プロンプトでそれを使用します。

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

短縮されたプロンプトはディレクトリの変更時にのみ変更されるため、プロンプトが表示されるたびに再計算する必要はありません。 Bashは現在のディレクトリの変更時に実行するフックを提供していませんが、cdおよびそのいとこをオーバーライドすることで シミュレート できます。

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 \$'

PS1は環境変数ではなくシェル設定であるため、エクスポートする必要はなく、エクスポートする必要もないことに注意してください。 bash PS1設定は、他のシェルでは理解されません。

追伸素敵なインタラクティブシェルエクスペリエンスが必要な場合は、 zsh に切り替えてください。これらすべて(tcshやchpwdなどを含むプロンプト%の展開)はネイティブ機能です。

PS1='%2~ %# '

親ディレクトリと現在のディレクトリを取得するための構文は、Munaiの answer から取得されます。

ただし、Gillesが指摘したように、そのコードは現在のディレクトリのみを表示します.bashrcは読み込まれますが、システムを他のフォルダに移動しても変更されません。

これを.bashrcファイルは、プロンプトを現在のディレクトリに自動的に更新します。

Prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
Prompt_COMMAND=Prompt_command
3
twalbaum

シェル変数PS1を編集することにより、bashでプロンプト文字列を簡単に変更できます。これはプロンプト文字列1を表します。詳細 ここ

とりあえずbashシェルを起動します。

vi ~/.bashrc

PS1定義をファイルに追加する

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

さらにチュートリアル here および here を使用すると、さらに微調整できます。

1

設定Prompt_DIRTRIM=2で十分です。

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

ホームディレクトリに「〜」が付いた、よりシンプルなものになる場合があります。

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