2013-02-13 15 views
13

私はPS1を設定して、ログイン直後に何かを出力するが、後で改行が始まるようにしようとしている。PS1で条件付き改行を設定するには?

と仮定export PS1="\h:\W \u\$ "ので、初めて(すなわち、右のログイン後に)あなたが得る:私は私の~/.bashrcでのようなものをしようとしてきた

hostname:~ username$ 

function __ps1_newline_login { 
    if [[ -n "${PS1_NEWLINE_LOGIN-}" ]]; then 
    PS1_NEWLINE_LOGIN=true 
    else 
    printf '\n' 
    fi 
} 

export PS1="\$(__ps1_newline_login)\h:\W \u\$ “ 

得ることを期待:

# <empty line> 
hostname:~ username$ 

最初の完全な例は次のとおりです。

hostname:~ username$ ls `# notice: no empty line desired above!` 
Desktop  Documents 

hostname:~ username$ 
+0

、あなたのコマンドが動作しない理由は、1)あなたは二重引用符を使用するため、実行__ps1_newline_loginされていること2)単一引用符を使用した場合、関数は$(..)のためにサブシェルで実行されるため、設定した変数はその外側には表示されません。 –

+0

@thatotherguyこの説明はありがとうございます。それは私の様々な問題を理解するのに本当に役立った。 – Ali

+0

@thatotherguyはこれについてもう一度考えます: '__ps1_newline_login'は毎回ではなく1回だけ実行されることを絶対に確信していますか?例えば、 '__git_ps1'はこの全く同じテクニックを使って、最初だけでなくすべてのプロンプトを設定します。 – Ali

答えて

13

次のことを試してみてください。

function __ps1_newline_login { 
    if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then 
    PS1_NEWLINE_LOGIN=true 
    else 
    printf '\n' 
    fi 
} 

PROMPT_COMMAND='__ps1_newline_login' 
export PS1="\h:\W \u\$ " 

説明:

  • PROMPT_COMMANDプロンプトが設定される前毎に実行される特別なbashの変数です。あなたは、文字列の長さが0 dogbaneの答えで実行
+0

この件についてさらに掘り下げています:関数から改行をエコー/印刷し、 'PS1'最初に '\ n'を含むように設定するかのように? – Ali

+0

私はあなたの質問を得るのかどうかは分かりませんが、 'PS1'に' \ n'を入れたいのであれば 'PS1'を単に更新し、' printf "の代わりに' PROMP_COMMAND'を解除するだけです。\ n "' – Mark

5

であれば、あなたは後に関数を実行する必要性を防止、PROMPT_COMMAND「自己破壊」を作ることができますチェックする-zフラグを使用する必要が

  • すべてのコマンド。あなたの.bashrcまたは.bash_profileファイルで

    、ファイルが処理されると

    export PS1='\h:\W \u\$ ' 
    reset_prompt() { 
        PS1='\n\h:\W \u\$ ' 
    } 
    PROMPT_COMMAND='((PROMPT_CTR-- < 0)) && { 
        unset PROMPT_COMMAND PROMPT_CTR 
        reset_prompt 
    }' 
    

    PS1が最初にプロンプ​​トの前に新しい行を表示しませんありません。 しかし、PROMPT_CTRは、最初にプロンプ​​トが表示される前に直ちに-1(暗黙のうちに0)になります。最初のコマンドの後に、PROMPT_COMMANDは、新しい行を含むようにプロンプ​​トをリセットする前に、それ自身とカウンタをクリアします。その後、PROMPT_COMMANDは実行されません。

    もちろん、PROMPT_COMMANDの代わりに、より一般的な機能にリセットされる、幸いな媒体があります。

    export PS1='\h:\W \u\$ ' 
    normal_prompt_cmd() { 
        ... 
    } 
    reset_prompt() { 
        PS1='\n\h:\W \u\$ ' 
    } 
    PROMPT_COMMAND='((PROMPT_CTR-- < 0)) && { 
        PROMPT_COMMAND=normal_prompt_cmd 
        reset_prompt 
        unset PROMPT_CTR 
        }' 
    
  • +0

    2番目のフォームで 'reset_prompt'してください?私は少し混乱しているかもしれませんが、私は認めなければなりません。 – Ali

    +0

    私は答えを更新しました。重要なことは、 'PROMPT_COMMAND'の中の' PROMPT_COMMAND'の値を変更できることです。 'PROMPT_COMMAND'は実行するミニスクリプトを含む文字列なので、実際には再帰的ではありません。スクリプトができることの1つは、 'PROMPT_COMMAND'の値を変更することです。 – chepner

    +0

    なぜ単に 'PROMPT_COMMAND =" $ {PROMPT_COMMAND} __ ps1_newline_login; "'? – Ali

    1

    2018のようなものを更新(chepnerの答えに触発)

    変更:

    1. No need to export PS1
    2. 私は "\ n個$ PS1" の代わりに再タイピング("$var"を使用文字列にvarを置きます。二重引用符でのみ動作します)。

    〜/に次のように入力します。bash_profile(あなたのプロンプトで最初の行を代入):あなたは、輸出ではなく、すべてのプロンプトを行う際の基準については

    PS1=YOUR PROMPT HERE (without newline) 
    
    reset_prompt() { 
        PS1="\n$PS1" 
    } 
    PROMPT_COMMAND='((PROMPT_CTR-- < 0)) && { 
        unset PROMPT_COMMAND PROMPT_CTR 
        reset_prompt 
    }' 
    
    +0

    私はこれが好きです! – Ali

    関連する問題