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

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

私は初めてbashに触れ、私のプロンプトがtcshでマイナーなものを見せることを望みましたが、良いGoogle検索の後でもまだできません。

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

/parent/currentdir $

tcsh では、次のことでこれを実現します。

set prompt = "%C2 %"

しかし、これまでbashは、同じ出力を得るためにpwdを解析する必要があるという事実だけを見つけました。

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

export PS1="$(some_command) $" 

ベストアンサー1

バッシュタイムリーな制御特性はかなり静的です。さらに制御したい場合は、プロンプトに変数を含めることができます。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変えるコードを実行して設定し、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環境変数ではなくシェル設定なので、エクスポートする必要もなく、エクスポートしないでください。PS1他のシェルは bash 設定を理解できません。

PS良いインタラクティブシェル体験をしたい場合は、次のように切り替えてください。扱いにくい、すべて(プロンプト%拡張には主にtcshchpwdなどが含まれます)基本機能です。

PS1='%2~ %# '

おすすめ記事