bashプロンプトで現在および親ディレクトリのみを表示する


16

私はbashが初めてであり、tcshで些細なことを表示するようにプロンプ​​トを表示したいのですが、良いGoogle検索を行ってもまだできません。

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

/parent/currentdir $

tcshでは、これは以下によって達成されます。

set prompt = "%C2 %"

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

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

export PS1="$(some_command) $" 

2
理論的にPS1='\w \$'; PROMPT_DIRTRIM=2は、同等のbashを提供する必要がありますが、それは私のシステムでは適切に機能しません。
ミケル

私の場合はまったく機能しません:GNU bash、バージョン3.2.57(1)-release(x86_64-apple-darwin14)。
twalbaum

PROMPT_DIRTRIMBash 4で導入されました。私はちょうどWSLの下でUbuntu 16.04でテストしましたが、うまくいきました!
マイクブランスキー

回答:


18

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変数を使用してコードを実行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 \$'

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

PS優れたインタラクティブシェルエクスペリエンスが必要な場合は、これらすべて(主にtcsh などを含むプロンプト展開)がネイティブ機能であるzshに切り替えます。%chpwd

PS1='%2~ %# '

2
これは受け入れられ、最も支持された答えであったはずです。
-LarsH

2

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

ただし、Gillesが述べたように、そのコード.bashrcはロードされた時点の現在のディレクトリのみを表示しますが、システムを他のフォルダーにナビゲートしても変更されません。

これを.bashrcファイルに含めると、プロンプトが現在のディレクトリに自動的に更新されます。

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

1
定義はprompt_command()それ自体で何かをすることになっていますか?それは私のためではありません。ジルのようprompt_command()cd&coの再定義にも使用するつもりでしたか?それとも意味PROMPT_COMMAND='...'ですか?
LarsH

2
また、$PWDスペースが含まれている場合、このコマンドは失敗します。
-LarsH

1
これに戻ってきてくれてありがとう。スペースを考慮して$ PWDを引用し、最後のコマンドを含めました。私の現在のプロンプトはこれよりも複雑であるため、prompt_command定義が必要です。それ以外の場合、PS1 = ...はオンで動作します。
twalbaum

に移動するときに出力をクリーンアップするためのアイデアはあり/ますか?書かれているように、あなたは得る/// $
ezrock

0

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

今のところbashシェルを起動します。

vi ~/.bashrc

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

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

さらに微調整するためのチュートリアルがこちらこちらにあります。


1
プロンプトの変更方法を理解しています。私の質問は、パス全体ではなく、現在のディレクトリと親ディレクトリのみを取得する方法です。
twalbaum

@twalbaumは私の答えを編集しました
ムナイダスウダシン

ヘルプ@twalbaum :)に喜ん
MunaiダスUdasin

1
これにより、プロンプト.bashrcがロードされた時点で現在のディレクトリに設定され、cd別のディレクトリに移動してもプロンプトは変わりません!@twalbaum
ジル 'SO-悪であるのをやめる'

@Gillesそれは私のためにします。
twalbaum

0

ホームディレクトリに「〜」を使用したシンプルなものである場合があります。

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"'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.