15

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

とするとexport PS1="\h:\W \u\$ "、初めて(つまり、ログイン直後)、次のようになります。

hostname:~ username$ 

私は私のようなものを試してきました~/.bashrc

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$ 
4

4 に答える 4

15

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

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変数です。
  • -z文字列の長さが0であるかどうかを確認するには、フラグを使用する必要があります。
于 2013-02-13T17:40:24.093 に答える
5

dogbaneの回答を使用して実行すると、PROMPT_COMMANDを「自己破壊」して、すべてのコマンドの後に関数を実行する必要をなくすことができます。

.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プロンプトをリセットして改行を含める前に、自身とカウンターをクリアします。その後、noPROMPT_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
  }'
于 2013-02-13T18:39:24.243 に答える
1

2018アップデート(chepnerの回答に触発されました)

更新PROMPT_COMMAND他の回答によって引き起こされた問題を修正しました

変更点:

  1. PS1をエクスポートする必要はありません
  2. 再入力する代わりに「\n$PS1」を使用しました。
  3. 他の回答は、のデフォルトの動作を妨害しPROMPT_COMMANDます(詳細は以下を参照)

〜/ .bash_profileに次のように入力します(最初の行をプロンプトに置き換えます)。

PS1=YOUR_PROMPT_HERE

add_newline_to_prompt() {
  is_new_login="true"
  INIT_PROMPT_COMMAND="$PROMPT_COMMAND"
  DEFAULT_PROMPT_COMMAND=update_terminal_cwd
  PROMPT_COMMAND='{
    if [ $is_new_login = "true" ]; then
      is_new_login="false"
      eval $INIT_PROMPT_COMMAND
    else
      PS1="\n$PS1"
      PROMPT_COMMAND=$DEFAULT_PROMPT_COMMAND
    fi
  }'
}

add_newline_to_prompt

PROMPT_COMMAND

ターミナルのタブ名が現在の作業ディレクトリに更新されていないことに気付き、調査を行いました。上記の解決策が混乱していることに気づきましたPROMPT_COMMAND。これを試してみてください:

  1. PROMPT_COMMAND構成ファイル(.bash_profileなど)での変更をコメントアウトします。
  2. INIT_PROMPT_COMMAND="$PROMPT_COMMAND"設定ファイルに追加します

次に、新しいシェルを開きます。

$ echo $INIT_PROMPT_COMMAND
shell_session_history_check; update_terminal_cwd
$ echo $PROMPT_COMMAND
update_terminal_cwd

新しいシェルを開くと、「履歴チェック」が実行され、タブの現在の作業ディレクトリの名前が更新されることに注意してください。最初は「履歴チェック」のみを実行し、その後は再度実行しないことに注意してください。

注:これはMacのターミナルでのみテストしました。他のシステムでは異なる場合があります。

于 2018-02-21T20:38:56.330 に答える
0

これを.bashrcに挿入します。

PROMPT_COMMAND="export PROMPT_COMMAND=echo"
alias clear="clear; export PROMPT_COMMAND='export PROMPT_COMMAND='echo''"

これはまさにあなたが望むものを達成します。PS1やその他の機能では\nは必要ありません。

于 2021-11-09T16:39:50.770 に答える