コマンドでgnome端末プロンプト文字列の形式を切り替えますか?


9

私の端末には次のようなデフォルトのプロンプト形式があります:

ユーザー名@ボックス名/ path / to / current / directory $

それを生成するコードは次のようになります:(色の定義もいくつかあります)

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

現在のディレクトリへのパスが長くなりすぎると、常に改行されるため、ターミナルを操作するのが不快になります。このような場合は、次のような短い文字列を生成する形式を使用します。

ユーザー名@ボックス名現在のディレクトリ名$

それを生成するコードは次のようになります(これも色付きです)。

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

たとえば、次のように入力するだけで、現在のターミナルウィンドウの形式をあるスタイルから別のスタイルに簡単に切り替える方法を知っている人はいますprompttoggleか?


6
bashのPROMPT_DIRTRIMパラメータを知っていますか?
鋼の運転手2016

@steeldriverは今までありません。との切り替えはPROMPT_DIRTRIM=0、のPROMPT_DIRTRIM=1異なる値の切り替えよりも簡単に見えますPS1。結果はほとんど同じです。情報をありがとう!
Rotareti 2016

使い方PROMPT_DIRTRIM1は、コマンドに引数を追加することができます。あなたは何の引数を渡していない場合は、切り替えるPROMPT_DIRTRIM=0PROMPT_DIRTRIM=1、あなたが設定され、引数として番号を渡した場合PROMPT_DIRTRIM、それに。promptlenその場合、コマンドにはより適切な名前になります。
Rotareti 2016

回答:


10

長いPS1変数と短い変数の両方を別の名前で保存します。

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

PS1最初にそれらのいずれかに設定してください。

PS1="$PS1long"

次に、次のようなエイリアスを作成して、2つのPS1値を切り替えることができます。

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

~/.bashrcファイルに4行すべてを追加すると、Bashセッションでコマンドを使用できるようになります。ここでは、コピーを簡単にするために、これらの行を再度示します。

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

7

あなたは小さなbash関数を使うことができます:

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

現在は次の場合に一致上記の機能$PS1が含まがbasename、そうならば、その後、PS1なしには、basenameそうでない場合との1に設定されてbasename設定されています。

関数をに配置して~/.bashrc、すべてのインタラクティブセッションで使用できるようにします。

例:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

5

または... 2つの非常に小さな関数を作成し、最後に追加します~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

短縮されたプロンプトの場合はpromptshort、と入力し、フルパスに戻るには、次のように入力します。promptlong

\W現在の作業ディレクトリのみを表示するので$(basename ${PWD})、やり過ぎです

1つの関数に組み合わせることができますが、「long」と「short」は説明的であり、どちらも「toggle」よりもキーストロークが少なくなっています;)

PS1をオーバーライドする行を追加する代わりに、PS1を設定するコードを微調整することを好みます(たとえば、force_color_prompt=yesの行のコメントを外して編集します[ "$color_prompt" = yes ]; then


3

これ~/.bashrcが私が個人的に使用する関数定義で、プロンプトを通常のプロンプトから単ににリセット/トグルします$。必要に応じて、ニーズに合わせて調整してください。

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 

1

これはあなたの問題(長いディレクトリはコマンドラインを壊す)への回答であり、あなたの質問(その場でコマンドプロンプトを変更する方法)に対するものではありません。

私はこの問題を数年前にこのプロンプトで解決しました:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

これは何をしますか:

  1. 前のコマンドの終了値を出力します(これは非常に便利です)
  2. 現在のユーザーとホストを1色で出力する
  3. 作業ディレクトリを別の色で出力します(好みに合わせて色を調整します)
  4. ドルとスペースを新しい行出力し、改行の前に色シーケンスを終了します

これにより、コマンドに必要なすべてのスペースが得られ、深いディレクトリ構造にいるときにそれを右にシフトせず、カラーコードで入力行を混乱させることはありません(時々起こる奇妙なバグを回避します)。 1つのコマンドの出力が終了した場所と次のコマンドの出力が開始した場所に関するヒント:

ここに画像の説明を入力してください

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