「Bash/プロンプトのカスタマイズ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(TranslationStatus)
 
(同じ利用者による、間の15版が非表示)
2行目: 2行目:
 
[[Category:コマンドラインシェル]]
 
[[Category:コマンドラインシェル]]
 
[[de:Bash-Prompt anpassen]]
 
[[de:Bash-Prompt anpassen]]
[[es:Color Bash Prompt]]
 
 
[[en:Bash/Prompt customization]]
 
[[en:Bash/Prompt customization]]
[[it:Color Bash Prompt]]
+
[[es:Bash (Español)/Prompt customization]]
[[ru:Bash/Prompt customization]]
+
[[ru:Bash (Русский)/Prompt customization]]
[[zh-hans:Color Bash Prompt]]
 
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|Bash}}
 
{{Related|Bash}}
16行目: 14行目:
 
== プロンプト ==
 
== プロンプト ==
   
Bash にはカスタマイズできる4つのプロンプトが存在します:
+
Bash にはカスタマイズ可能な5つの''プロンプト文字列''が存在します:
   
* {{ic|PS1}} はコマンドが実行される前に表示されるプライマリプロンプトで多くの人がカスタイズしているのはこのプロプトです
+
* {{ic|PS0}} はコマンドの入力完了した後で、そのコマンドの出力が開始される前に表示されます。(つまりマンドの実行開始直前)
* {{ic|PS2}} はコマンド入力が必要な場合に表示されるセカンダリプロンプトです (複数行ンドを入力する場合など)
+
* {{ic|PS1}} はコマンド入力が開始される前に表示されるプライマリプロンプトです。なで、ほとんどの人がカスタイズするのはこのプロンプト文字列です
  +
* {{ic|PS2}} は、コマンドにさらに多くの入力 (例えば複数行のコマンド) が必要とされる際に表示されるセカンダリプロンプトです。
* {{ic|PS3}} は滅多に使われないプロンプトです。Bash の {{ic|select}} によってインタラクティブメニューが表示されるときに使われるプロンプトです。他のプロンプトと違って、 [[#Bash のエスケープシーケンス|Bash のエスケープシーケンス]]を拡張することはできません。通常は {{ic|.bashrc}} ではなく {{ic|select}} を使用しているスクリプトの方でカスタマイズを行います。
 
  +
* {{ic|PS3}} は滅多に使われません。これは、Bash の {{ic|select}} 組み込みコマンドによってインタラクティブメニューが表示されるときに使われるプロンプト文字列です。他のプロンプトと違って、このプロンプトでは [[#Bash のエスケープシーケンス|Bash のエスケープシーケンス]]を展開することはできません。通常、このプロンプトは {{ic|.bashrc}} ではなく、{{ic|select}} が使用されているスクリプト内でカスタマイズします。
* {{ic|PS4}} も基本的に使用されないプロンプトです。Bash スクリプトをデバッグする際に間接参照のレベルを表すために表示されます。最初の文字が繰り返されてレベルの深さを表します。
 
  +
* {{ic|PS4}} も滅多に使われません。Bash スクリプトをデバッグする際に間接参照のレベルを表示するために使われます。最初の文字が繰り返されて、レベルの深さを表します。
   
全てのプロンプトはそれぞれに対応する変数を設定することでカスタマイズできます (大抵は {{ic|~/.bashrc}} で設定します):
+
全てのプロンプトはそれぞれに対応する変数を設定することでカスタマイズできます (大抵は {{ic|~/.bashrc}} で設定します)。例えば:
   
export PS2='> '
+
PS2='> '
   
 
== テクニック ==
 
== テクニック ==
33行目: 32行目:
 
=== Bash のエスケープシーケンス ===
 
=== Bash のエスケープシーケンス ===
   
プロンプトの文字列を表示するとき、Bash は特定のバックスラッシュでエスケープされた文字列を特殊な文字列に変換します。例えば {{ic|\u}} は現在のユーザー名になり {{ic|\A}} は現在時刻になります。PS1 を {{ic|'\A \u $ '}} と設定すると {{ic|17:35 ''username'' $ }} といった具合に表示されます。
+
プロンプトの文字列を表示するとき、Bash はバックスラッシュでエスケープされた特定の文字列を探し、特殊な文字列に展開します。例えば {{ic|\u}} は現在のユーザー名になり {{ic|\A}} は現在時刻になります。PS1 を {{ic|'\A \u $ '}} と設定すると {{ic|17:35 ''username'' $ }} といった具合に表示されます。
   
エスケープシーケンスの完全なリストは Bash の man ページの中の "PROMPTING" セクションを確認してください。
+
エスケープシーケンスの完全なリストは、{{man|1|bash|PROMPTING}} man ページ [https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html Bash リファレスマニュアル]参照してください。
   
 
=== Terminfo のエスケープシーケンス ===
 
=== Terminfo のエスケープシーケンス ===
   
Bash によって認識されるエスケープシーケンスの他に、大抵のターミナルは特殊なエスケープシーケンスを認識して表示される文字列だけでなくターミナル自体に変化を起こします。例えば、表示される文字列の色を変更したり、カーソルを任意の場所に移動したり、画面を消去したりすることができます。ようなエスケープシーケンスは人間がむことができな形で表され、ターミナルによって違うこともあります。terminfo データベースでドキュメント化されています。ターミナルサポートている機能を確認するには、次のコマンドを実行:
+
Bash によって認識されるエスケープシーケンスの他に、大抵のターミナルは、文字を表示するのではなくターミナル自体に何らかの効果を与える特殊なエスケープシーケンスを認識します。例えば、表示される文字列の色を変更したり、カーソルを任意の場所に移動したり、画面を消去したりすることができます。これらのエスケープシーケンスは、どういうわけかみにくい記述法を使用しており、ターミナルによって違うこともあります。なので、terminfo データベースでドキュメント化されています。ターミナルによってサポートされている機能を確認するには、次のコマンドを実行してください:
   
 
$ infocmp
 
$ infocmp
   
機能の名前 (= よりも前の部分) は {{man|5|terminfo}} の man ページを読めば何なのか説明を見ることができます。例えば {{ic|setaf}} は出力されるテキストの前景色を設定します。特定の機能のエスケープシーケンスを確認するには、{{ic|tput}} コマンドを使います。例:
+
機能の名前 (= よりも前の部分) は {{man|5|terminfo}} の man ページを読めば何なのか説明を見ることができます。例えば {{ic|setaf}} は出力されるテキストの前景色を設定します。特定の機能のエスケープシーケンスを出力するには、{{ic|tput}} コマンドを使います。例:
   
 
$ tput setaf 2
 
$ tput setaf 2
49行目: 48行目:
 
上記のコマンドは前景色を緑に設定するエスケープシーケンスを表示します。
 
上記のコマンドは前景色を緑に設定するエスケープシーケンスを表示します。
   
{{Note|tput コマンドが使えない場合、{{ic|TERM}} 環境変数が正しく設定されているか確認してください。例えば {{ic|xterm-256color}} ではなく {{ic|xterm}} と設定していると {{ic|tput setaf}} は0から7までの色番号しか扱えません。}}
+
{{Note|tput コマンドが失敗する場合、{{ic|TERM}} 環境変数が正しく設定されているか確認してください。例えば {{ic|xterm-256color}} ではなく {{ic|xterm}} と設定していると {{ic|tput setaf}} は0から7までの色番号しか扱えません。}}
   
使用できる機能をプロンプトに組み込むときは、Bash のコマンド置換と補完機能を使用できます。例:
+
Bash のコマンド置換と文字列補間を使用すれば、これらの機能を実際にプロンプトに組み込むできます。例えば:
   
{{hc|~/.bashrc|<nowiki>GREEN="\[$(tput setaf 2)\]"
+
{{bc|<nowiki>
  +
GREEN="\[$(tput setaf 2)\]"
 
RESET="\[$(tput sgr0)\]"
 
RESET="\[$(tput sgr0)\]"
   
export PS1="${GREEN}my prompt${RESET}> "</nowiki>}}
+
PS1="${GREEN}my prompt${RESET}> "
  +
</nowiki>}}
<div style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: white;"><span style="color: #0f0">my prompt</span>> </div>
 
   
  +
<div class="mw-no-invert" style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: #c0c0c0;"><span style="color: #0f0">my prompt</span>> </div>
{{Note|Bash の man ページでは tput の出力を {{ic|\[ \]}} で囲うことを推奨しています。Bash が出力不可能な文字列を無視するようになるため正確にプロンプトのサイズを計算できるようになります。}}
 
  +
  +
{{Note|Bash の man ページでは、tput の出力を {{ic|\[ \]}} で囲むことが推奨されています。こうすることにより、Bash は表示できない文字を無視するようになり、プロンプトのサイズを正しく計算できるようになります。この方法はコマンド置換では機能しないので、代わりに[https://superuser.com/a/301355 生の {{ic|\1 \2}}] を使用しなければなりません。}}
   
 
=== ANSI のエスケープシーケンス ===
 
=== ANSI のエスケープシーケンス ===
65行目: 67行目:
 
残念がら、ANSI のエスケープシーケンスはターミナルの terminfo データベースには載っていないことがあります。特に256色のサポートなど新しい機能のエスケープシーケンスはデータベースに入っていないことがよくあります。tput を使えない場合、エスケープシーケンスを手動で入力する必要があります。
 
残念がら、ANSI のエスケープシーケンスはターミナルの terminfo データベースには載っていないことがあります。特に256色のサポートなど新しい機能のエスケープシーケンスはデータベースに入っていないことがよくあります。tput を使えない場合、エスケープシーケンスを手動で入力する必要があります。
   
エスケープシーケンスの例は [[Wikipedia:ANSI escape code]] を見てください。全てのエスケープシーケンスはリテラルのエスケープ文字から始まり Bash のエスケープシーケンス {{ic|\e}} を使って入力できます。例えば {{ic|\e[48;5;209m}} は背景を桃色 (ターミナルが256色をサポートしている場合) に設定し、{{ic|\e[2;2H}} はカーソルを画面左上に移動します。
+
エスケープシーケンスの例は [[Wikipedia:ANSI escape code]] を見てください。全てのエスケープシーケンスはリテラルのエスケープ文字から始まりBash のエスケープシーケンス {{ic|\e}} を使って入力できます。例えば {{ic|\e[48;5;209m}} は背景を桃色 (ターミナルが256色をサポートしている場合) に設定し、{{ic|\e[2;2H}} はカーソルを画面左上に移動します。
   
Bash のエスケープシーケンスがサポートされていない場合 (PS3 など)、Bash の printf を使うことでリテラルのエスケープ文字を使用できます:
+
Bash のエスケープシーケンスがサポートされていない場合 (PS3 など)、Bash の printf 組み込みコマンドを使うことでリテラルのエスケープ文字を使用できます:
   
 
ESC=$(printf "\e")
 
ESC=$(printf "\e")
74行目: 76行目:
 
=== コマンドの埋め込み ===
 
=== コマンドの埋め込み ===
   
何かコマンドの出力をプロンプトに追加したい場合、コマンド置換を使えばいいと思うかもしれません。例えば、空きメモリ容量をプロンプトに追加しようと以下のように設定した場合:
+
コマンドの出力をプロンプトに追加したい場合、コマンド置換を使えばいいと思うかもしれません。例えば、空きメモリ容量をプロンプトに追加しようと以下のように設定した場合:
  +
{{hc|1=export PS1="$(awk '/MemFree/{print $2}' /proc/meminfo) prompt > "|2=53718 prompt >
 
  +
{{hc|1=PS1="$(awk '/MemFree/{print $2}' /proc/meminfo) prompt > "|2=53718 prompt >
 
53718 prompt >
 
53718 prompt >
53718 prompt >}}
+
53718 prompt >
  +
}}
   
上記の設定は上手くいきません。表示されるメモリの容量はいつも同じになってしまいます。原因はコマンドの実行が一回しか行われず、PS1 が一度設定されると、二度と変わらないためです。{{ic|$}} をエスケープするかシングルクォートの中で定義するようにすることで、プロンプトが実際に表示されるときにコマンド置換がされるようになります:
+
しかし、上記の設定は上手くいきません。表示されるメモリの容量はいつも同じになってしまいます。原因はコマンドの実行が一回しか行われず、PS1 が一度設定されると、二度と変わらないためです。{{ic|$}} をエスケープするかシングルクォートの中で定義するようにすることで、プロンプトが実際に表示されるときにコマンド置換がされるようになります:
   
export PS1="\$(awk '/MemFree/{print \$2}' /proc/meminfo) prompt > "
+
PS1="\$(awk '/MemFree/{print \$2}' /proc/meminfo) prompt > "
  +
# あるいは
# or
 
export PS1='$(awk "/MemFree/{print \$2}" /proc/meminfo) prompt > '
+
PS1='$(awk "/MemFree/{print \$2}" /proc/meminfo) prompt > '
   
コマンドが長い場合は、関数を定義することで PS1 の肥大化抑えられます:
+
コマンドが長い場合は、関数を定義することで PS1 をコンパクトにできます:
   
{{bc|1=free_mem()
+
{{bc|1=
  +
free_mem()
 
{
 
{
 
awk '/MemFree/{print $2}' /proc/meminfo
 
awk '/MemFree/{print $2}' /proc/meminfo
 
}
 
}
   
export PS1='$(free_mem) prompt > '}}
+
PS1='$(free_mem) prompt > '
  +
}}
   
{{Note|置換される関数の中で terminfo/ANSI のエスケープシーケンスを使うことはできますが Bash のエスケープを使うことはできません。特に {{ic|\[ \]}} で出力不可能な文字列を囲んでも機能しません。代わりに8進数のエスケープ {{ic|\001}} や {{ic|\002}} を使ってください (例えば {{ic|printf}} や {{ic|echo -e}} を使用する場合)。}}
+
{{Note|置換される関数の中で terminfo/ANSI のエスケープシーケンスを使うことはできますがBash のエスケープを使うことは'''できません'''。特に{{ic|\[ \]}} で出力不可能な文字列を囲んでも、期待通りに動作しません。代わりに8進数のエスケープ {{ic|\001}} や {{ic|\002}} を使ってください (例えば{{ic|printf}} や {{ic|echo -e}} を使うなどして)。}}
   
 
=== PROMPT_COMMAND ===
 
=== PROMPT_COMMAND ===
   
{{ic|PROMPT_COMMAND}} 変数設定ことで、PS1 が表示される直前に評価することができます。非常に強力な使い方ができます。例えば特定の条件 PS1 を再定義したり、コマンドを実行ときに Bash の履歴に何らかの操作を加えたりできます。
+
{{ic|PROMPT_COMMAND}} 変数または配列が設定されてい場合、PS1 が表示される直前に評価されます。これは、非常に強力な使い方ができます。例えば条件式に応じて PS1 を再定義したり、コマンドを実行するに Bash の履歴に何らかの操作を加えたりできます。
  +
  +
{{Note|一般に、プロンプトに文字列を直接出力するために {{ic|PROMPT_COMMAND}} を使用するべきではありません。PS1 の外で出力された文字列は Bash によってカウントされないため、カーソルの位置がおかしくなったり文字が消えたりしてしまう原因になります。{{ic|PROMPT_COMMAND}} は PS1 を設定するために使用するか、[[#コマンドの埋め込み]] の方法を使ってください。}}
   
  +
{{Tip|{{ic|PROMPT_COMMAND}} が複雑になりすぎてしまう場合、[https://github.com/rcaloras/bash-preexec bash-preexec] ([[Zsh]] のフック関数 {{ic|preexec}} と {{ic|precmd}} の Bash 版実装) を使えば管理しやすくなるかもしれません。}}
{{Warning|プロンプトに直接文字列を表示するのに PROMPT_COMMAND は使わないでください。PS1 の外で出力された文字は Bash によってカウントされないため、カーソルの位置がおかしくなったり文字列が消えてしまう現象が発生します。PROMPT_COMMAND を使って PS1 を設定するか[[#コマンドの埋め込み|コマンドの埋め込み]]を見てください。}}
 
   
=== コマンドの入力と出力の間エスケープ ===
+
=== コマンドの入力完了実行開始の間エスケープシーケンス ===
   
PS1 の末尾でテキストのプロパティを再設定することなく、Bash に入力したテキストを変化させることができます。例えば、PS1 の最後に {{ic|tput blink}} を追加するとタイピングしたコマンドが点滅します。ただし、エンターを押してもテキストのプロパティはリセットされないため、コマンド出力しているとき効果は継続します。
+
PS1 の末尾でテキストのプロパティをリセットせずにそのままにしておくこと、Bash に入力したテキストにもそのプロパティ反映させることができます。例えば、PS1 の最後に {{ic|tput blink}} を追加すると、入力されたコマンドが点滅します。ただし、エンターを押してもテキストのプロパティはリセットされないため、実行されたコマンド出力影響が及びます。
   
コマンドを入力した後、コマンドの出力表示される前にエスケープシーケンスを挿入するは、コマンドが実行される直前に送信される Bash の DEBUG シグナルを使ってください:
+
PS0 にエスケープシーケンスを設定することで、コマンドを入力した後、かつそのコマンドが実行される前にそのエスケープシーケンスを挿入することができます。あるいは、コマンドが実行される直前に送信される Bash の DEBUG シグナルを捕捉することで、同じことをすることができます:
   
  +
$ trap 'tput sgr0' DEBUG
{{hc|~/.bashrc|
 
<nowiki>trap 'tput sgr0' DEBUG</nowiki>}}
 
   
 
=== root プロンプトのカスタマイズ ===
 
=== root プロンプトのカスタマイズ ===
117行目: 124行目:
 
== サンプル ==
 
== サンプル ==
   
=== カラー ===
+
=== ===
   
{{Tip|{{ic|infocmp}} は {{ic|tput}} で使える色番号を表示します。例: {{ic|colors#8}}。}}
+
{{Tip|{{ic|infocmp}} は{{ic|tput}} で利用できる色の数を表示します。例: {{ic|colors#8}} (8つの色が利用可能)。}}
   
ターミナルが対応している色の範囲を確認するには、tput を一度してください (テキストの前景の場合は {{ic|setab}} を {{ic|setaf}} に置き換えてください):
+
ターミナルでサポートされている色の完全な範囲は、tput を単純なループですことで確認できます (背景色ではなく前景色で表示するには {{ic|setab}} を {{ic|setaf}} に置き換えてください)
   
  +
{{bc|
{{bc|for C in {0..255}; do
 
  +
for C in {0..255}; do
 
tput setab $C
 
tput setab $C
 
echo -n "$C "
 
echo -n "$C "
 
done
 
done
 
tput sgr0
 
tput sgr0
echo}}
+
echo
  +
}}
   
上記のコマンドが使えない場合 ([[#Terminfo のエスケープシーケンス|適切な TERM の値]]を設定しても解決ない場合)、手動でエスケープシーケンステストます:
+
上記のコマンドが動かない場合 (そして、[[#Terminfo のエスケープシーケンス|TERM に適切な値]]を設定しても問題が解決できない場合)、別のエスケープシーケンステストすることもできます:
   
{{bc|# standard colors
+
{{bc|
  +
# 標準色
 
for C in {40..47}; do
 
for C in {40..47}; do
 
echo -en "\e[${C}m$C "
 
echo -en "\e[${C}m$C "
 
done
 
done
  +
# 高輝度色
# high intensity colors
 
 
for C in {100..107}; do
 
for C in {100..107}; do
 
echo -en "\e[${C}m$C "
 
echo -en "\e[${C}m$C "
 
done
 
done
# 256 colors
+
# 256
 
for C in {16..255}; do
 
for C in {16..255}; do
 
echo -en "\e[48;5;${C}m$C "
 
echo -en "\e[48;5;${C}m$C "
147行目: 157行目:
 
}}
 
}}
   
手動のエスケープを背景から前景に変更する場合、標準色の範囲 {{ic|30..37}} でさら多くのが使える場合 {{ic|90..97}} です。256色では4838になります
+
エスケープシーケンスを背景から前景に変更したい場合、標準色の範囲 {{ic|30..37}} に、高輝度の範囲を {{ic|90..97}} にし、256色ではエスケープシーケンスの {{ic|48}} の部分を {{ic|38}} 変更してください
   
 
=== 一般的な機能 ===
 
=== 一般的な機能 ===
158行目: 168行目:
 
!colspan="3"| テキストの属性
 
!colspan="3"| テキストの属性
 
|-
 
|-
| blink || \E[5m || テキストの点滅をオン
+
| blink || \e[5m || テキストの点滅をオン
 
|-
 
|-
| bold || \E[1m || 太字テキストをオン
+
| bold || \e[1m || 太字テキストをオン
 
|-
 
|-
| dim || \E[2m || 淡色テキストをオン
+
| dim || \e[2m || 淡色テキストをオン
 
|-
 
|-
| rev || \E[7m || 逆転表示をオン (テキスト色と背景色が切り替わります)
+
| rev || \e[7m || 逆転表示をオン (前景色と背景色が入れ替わります)
 
|-
 
|-
| sitm || \E[3m || 斜字テキストをオン
+
| sitm || \e[3m || 斜字テキストをオン
 
|-
 
|-
| ritm || \E[23m || 斜字テキストをオフ
+
| ritm || \e[23m || 斜字テキストをオフ
 
|-
 
|-
| smso || \E[7m || テキストのハイライトをオン
+
| smso || \e[7m || テキストのハイライトをオン
 
|-
 
|-
| rmso || \E[27m || テキストのハイライトをオフ
+
| rmso || \e[27m || テキストのハイライトをオフ
 
|-
 
|-
| smul || \E[4m || テキストの下線をオン
+
| smul || \e[4m || テキストの下線をオン
 
|-
 
|-
| rmul || \E[24m || テキストの下線をオフ
+
| rmul || \e[24m || テキストの下線をオフ
 
|-
 
|-
| setab '''#1''' || \E[4'''#1'''m || 背景色を '''#1''' (0-7) に設定
+
| setab '''#1''' || \e[4'''#1'''m || 背景色を '''#1''' (0-7) に設定
 
|-
 
|-
| setaf '''#1''' || \E[3'''#1'''m || テキスト色を '''#1''' (0-7) に設定
+
| setaf '''#1''' || \e[3'''#1'''m || テキスト色を '''#1''' (0-7) に設定
 
|-
 
|-
| sgr0 || \E(B\E[m || テキストの属性をリセット
+
| sgr0 || \e(B\e[m || テキストの属性をリセット
 
|-
 
|-
 
!colspan="3"| カーソルの移動
 
!colspan="3"| カーソルの移動
 
|-
 
|-
| sc || \E7 || カーソルの位置を保存
+
| sc || \e7 || カーソルの位置を保存
 
|-
 
|-
| rc || \E8 || 保存したカーソルの位置に戻す
+
| rc || \e8 || 保存したカーソルの位置に戻す
 
|-
 
|-
| clear || \E[H\E[2J || 画面消去カーソルを一番左に移動
+
| clear || \e[H\e[2J || 画面をクリアカーソルを左に移動
 
|-
 
|-
| cuu '''#1''' || \E['''#1'''A || '''#1''' 行分だけカーソルを上に移動
+
| cuu '''#1''' || \e['''#1'''A || '''#1''' 行分だけカーソルを上に移動
 
|-
 
|-
| cud '''#1''' || \E['''#1'''B || '''#1''' 行分だけカーソルを下に移動
+
| cud '''#1''' || \e['''#1'''B || '''#1''' 行分だけカーソルを下に移動
 
|-
 
|-
| cuf '''#1''' || \E['''#1'''C || '''#1''' 列分だけカーソルを右に移動
+
| cuf '''#1''' || \e['''#1'''C || '''#1''' 列分だけカーソルを右に移動
 
|-
 
|-
| cub '''#1''' || \E['''#1'''D || '''#1''' 列分だけカーソルを左に移動
+
| cub '''#1''' || \e['''#1'''D || '''#1''' 列分だけカーソルを左に移動
 
|-
 
|-
| home || \E[H || カーソルを左に移動
+
| home || \e[H || カーソルを左に移動
 
|-
 
|-
| hpa '''#1''' || \E['''#1'''G || カーソルを '''#1''' 列目に移動
+
| hpa '''#1''' || \e['''#1'''G || カーソルを '''#1''' 列目に移動
 
|-
 
|-
| vpa '''#1''' || \E['''#1'''d || カーソルを '''#1''' 行目の1列目に移動
+
| vpa '''#1''' || \e['''#1'''d || カーソルを '''#1''' 行目の1列目に移動
 
|-
 
|-
| cup '''#1''' '''#2''' || \E['''#1''';'''#2'''H || カーソルを '''#1''' 行目の '''#2''' 列目に移動
+
| cup '''#1''' '''#2''' || \e['''#1''';'''#2'''H || カーソルを '''#1''' 行目の '''#2''' 列目に移動
 
|-
 
|-
 
!colspan="3"| 文字列の削除
 
!colspan="3"| 文字列の削除
 
|-
 
|-
| dch '''#1''' || \E'''#1'''P || (バックスペースと同じように) '''#1''' 文字を削除
+
| dch '''#1''' || \e'''#1'''P || (バックスペースと同じように) 文字を '''#1''' 削除
 
|-
 
|-
| dl '''#1''' || \E'''#1'''M || '''#1''' 行を削除
+
| dl '''#1''' || \e'''#1'''M || 行を '''#1''' 削除
 
|-
 
|-
| ech '''#1''' || \E'''#1'''X || '''#1''' 文字を消去 (カーソルの移動は伴わない)
+
| ech '''#1''' || \e'''#1'''X || 文字を '''#1''' 消去 (カーソルの移動は伴わない)
 
|-
 
|-
| ed || \E[J || 画面下端まで消去
+
| ed || \eE[J || 画面下端まで消去
 
|-
 
|-
| el || \E[K || 行末まで消去
+
| el || \e[K || 行末まで消去
 
|-
 
|-
| el1 || \E[1K || 行頭まで消去
+
| el1 || \e[1K || 行頭まで消去
 
|}
 
|}
   
227行目: 237行目:
 
[[#コマンドの埋め込み|コマンドの埋め込み]]と同じ方法で {{ic|$?}} などの特殊な Bash 変数の補完を遅延させることができます。以下のプロンプトは前に実行したコマンドの終了コードを表示します:
 
[[#コマンドの埋め込み|コマンドの埋め込み]]と同じ方法で {{ic|$?}} などの特殊な Bash 変数の補完を遅延させることができます。以下のプロンプトは前に実行したコマンドの終了コードを表示します:
   
export PS1="\$? > "
+
PS1="\$? > "
# or
+
# または
export PS1='$? > '
+
PS1='$? > '
   
<div style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: white;">0 > true<br>0 > false<br>1 ></div>
+
<div class="mw-no-invert" style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: #c0c0c0;">0 > true<br>0 > false<br>1 ></div>
   
条件と関数を使うことでさらにわかりやすくすることができます:
+
条件と関数を使うことでさらにわかりやすくすることができます:
   
{{bc|<nowiki>exitstatus()
+
{{bc|<nowiki>
  +
exitstatus()
 
{
 
{
 
if [[ $? == 0 ]]; then
 
if [[ $? == 0 ]]; then
243行目: 254行目:
 
fi
 
fi
 
}
 
}
export PS1='$(exitstatus) > '</nowiki>}}
+
PS1='$(exitstatus) > '
  +
</nowiki>}}
   
<div style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: white;">:) > true<br>:) > false<br>D: ></div>
+
<div class="mw-no-invert" style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: #c0c0c0;">:) > true<br>:) > false<br>D: ></div>
   
 
=== カーソルの位置 ===
 
=== カーソルの位置 ===
   
PS1 の中でカーソルを移動することで様々な場所にプロンプトを表示させることができます。ただ、何別のものを出力した後は元の位置にカーソルを移動しくてはなりません。tput の {{ic|sc}} と {{ic|rc}} 機能を使うことでカーソルの位置を保存して後で戻すことができます。カーソルを移動するプロンプトを作るときは一般に以下のようにます:
+
PS1 の中でカーソルを移動することでプロンプトをパーツに分けてそれぞれを別々の場所に表示させることができます。しかし、カーソルと出力を正位置に表示させるために、プロンプトの表示が終わったらカーソルを元の場所に戻さければなりません。tput の {{ic|sc}} と {{ic|rc}} という機能を使うことでカーソルの位置を保存して後で戻すことができます。カーソルを移動するプロンプトは一般に以下のようになります:
   
export PS1="\[$(tput sc; ''cursor-moving code'') ''positioned prompt stuff'' $(tput rc)\] ''normal prompt stuff''"
+
PS1="\[$(tput sc; ''カーソル移動のコード'') ''移動されたプロンプト'' $(tput rc)\] ''通常のプロンプト''"
   
再配置するプロンプトのブロック{{ic|\[ \]}} で囲って Bash が通常のプロンプトとしてカウントしないようにしてください
+
移動されたプロンプトは、Bash によって通常のプロンプトの一部として認識されないようにするために、{{ic|\[ \]}} 内に記述ます
   
==== テキストを右に整列 ====
+
==== テキストを右寄せ ====
   
  +
テキストを右寄せで表示させる最も単純な方法は、printf を使うことです:
printf を使うことで簡単に画面右側にテキストを表示できます:
 
   
{{bc|1=rightprompt()
+
{{bc|1=
  +
rightprompt()
 
{
 
{
 
printf "%*s" $COLUMNS "right prompt"
 
printf "%*s" $COLUMNS "right prompt"
 
}
 
}
   
export PS1='\[$(tput sc; rightprompt; tput rc)\]left prompt > '
+
PS1='\[$(tput sc; rightprompt; tput rc)\]left prompt > '
 
}}
 
}}
   
<div style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: white;"><span style="float: right">right prompt</span>left prompt > </div>
+
<div class="mw-no-invert" style="font-family: monospace; white-space: pre; padding: 1em; background-color: black; border: 1px solid #bcd; color: #c0c0c0;">left prompt > <span style="float: right">right prompt</span></div>
   
上記の設定では右側に表示する数サイズのフィールド {{ic|%*s}} を作成してサイズをターミナルの列数の正確な数 {{ic|$COLUMNS}} に設定しています。
+
上記のコード寄せの可フィールド {{ic|%*s}} を作成しターミナルの現在の列数 {{ic|$COLUMNS}} に対して文字列のサイズを設定します。
   
 
==== 任意の位置 ====
 
==== 任意の位置 ====
279行目: 292行目:
 
=== ターミナルのウィンドウタイトルのカスタマイズ ===
 
=== ターミナルのウィンドウタイトルのカスタマイズ ===
   
プロンプトと同じようにシェルにエスケープシーケンスを出力することでターミナルのウィンドウタイトルカスタマイできます。プロンプトウィンドウタイトルカスタマイズすることがきます。技術には xterm の機能ですが、近代的なターミナルの多くがカスタマイズをサポートしています。使用するエスケープシーケンスは {{ic|'''ESC''']2;''new title'''''BEL'''}} です。{{ic|'''ESC'''}} と {{ic|'''BEL'''}} はエスケープとベル文字列に置き換えてください。[[#Bash のエスケープシーケンス|Bash のエスケープシーケンス]]を使用する場合、以下のように設定することでプロンプトタイトルを変えられます:
+
プロンプトと同じ方法 (シェルにエスケープシーケンスを出力する) ターミナルのウィンドウタイトルカスタマイできます。なので、プロンプト内にウィンドウタイトルカスタマイズするコードを含めるのは一般的です。これは技術で器には xterm の機能ですが、ターミナルの多くはこの機能をサポートしています。使用するエスケープシーケンスは {{ic|'''ESC''']2;''new title'''''BEL'''}} です。ここで、{{ic|'''ESC'''}} と {{ic|'''BEL'''}} はそれぞれエスケープ文字とベル文字です。[[#Bash のエスケープシーケンス|Bash のエスケープシーケンス]]を使えば、以下のようにしてプロンプト内でタイトルを変更できます:
   
export PS1='\[\e]2;''new title''\a\]prompt > '
+
PS1='\[\e]2;''タイトル''\a\]prompt > '
   
もちろんウィンドウタイトルの文字列には[[#コマンドの埋め込み|コマンドの出力結果]]を含めたり {{ic|$PWD}} などの変数を使えます。
+
もちろんウィンドウタイトルの文字列には[[#コマンドの埋め込み|コマンドの出力結果]] {{ic|$PWD}} などの変数を含めることができ、プロンプトが表示されるたびにタイトルを変化させることができます。
   
 
== 参照 ==
 
== 参照 ==
   
* フォーラムスレッドに投稿されたコミュニティの作例とスクリーンショット: [https://bbs.archlinux.org/viewtopic.php?id=50885 What's your PS1?]
+
* Arch フォーラムスレッドに投稿されたコミュニティの作例とスクリーンショット: [https://bbs.archlinux.org/viewtopic.php?id=50885 What's your PS1?] (ログインした場合にのみ閲覧可)
* [https://gitweb.gentoo.org/repo/gentoo.git/tree/app-shells/bash/files/bashrc Gentoo の {{ic|/etc/bash/bashrc}}]。{{AUR|gentoo-bashrc}} も参照。
+
* [https://gitweb.gentoo.org/repo/gentoo.git/tree/app-shells/bash/files/bashrc Gentoo の /etc/bash/bashrc]。{{AUR|gentoo-bashrc}} も参照。
 
* {{man|1|tput}}
 
* {{man|1|tput}}
  +
** [https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html tput によるカラー出力とカーソル移動]
** [http://wiki.bash-hackers.org/scripting/terminalcodes bash-hackers.org の tput リファレンス]
 
** [http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html tput によるカラー出力とカーソル移動]
+
* [https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html Bash Prompt HOWTO]
* [http://xcolors.net/ Xresources カラースキームのコレクション]
+
* [https://gilesorr.com/bashprompt/prompts/index.html Giles Orr1プロンプトコレクション]
  +
* [https://misc.flogisoft.com/bash/tip_colors_and_formatting Bash ヒント: カラー出力とフォーマット]
* [http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html Bash Prompt HOWTO]
 
* [http://gilesorr.com/bashprompt/prompts/index.html Giles Orr1 のプロンプトコレクション]
 
* [http://misc.flogisoft.com/bash/tip_colors_and_formatting Bash ヒント: カラー出力とフォーマット]
 
 
* [https://github.com/nojhan/liquidprompt Liquid Prompt — Bash & zsh 用の便利なアダプティブプロンプト]
 
* [https://github.com/nojhan/liquidprompt Liquid Prompt — Bash & zsh 用の便利なアダプティブプロンプト]
* [http://www.askapache.com/linux-unix/bash-power-prompt.html Bash POWER PROMPT]
+
* [https://www.askapache.com/linux/bash-power-prompt/ Bash POWER PROMPT]
 
* [[Wikipedia:ANSI escape code]]
 
* [[Wikipedia:ANSI escape code]]
  +
* [https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html GNU Bash manual: プロンプトの制御]
  +
  +
{{TranslationStatus|Bash/Prompt customization|2023-10-14|789850}}

2023年10月14日 (土) 17:50時点における最新版

関連記事

Bash には複数のプロンプトが存在しカスタマイズすることで効率を高めたりセンスを良くしたりオタクっぽくできます。

プロンプト

Bash にはカスタマイズ可能な5つのプロンプト文字列が存在します:

  • PS0 は、コマンドの入力が完了した後で、そのコマンドの出力が開始される前に表示されます。(つまり、コマンドの実行開始直前。)
  • PS1 は、コマンドの入力が開始される前に表示されるプライマリプロンプトです。なので、ほとんどの人がカスタマイズするのはこのプロンプト文字列です。
  • PS2 は、コマンドにさらに多くの入力 (例えば複数行のコマンド) が必要とされる際に表示されるセカンダリプロンプトです。
  • PS3 は滅多に使われません。これは、Bash の select 組み込みコマンドによってインタラクティブメニューが表示されるときに使われるプロンプト文字列です。他のプロンプトと違って、このプロンプトでは Bash のエスケープシーケンスを展開することはできません。通常、このプロンプトは .bashrc ではなく、select が使用されているスクリプト内でカスタマイズします。
  • PS4 も滅多に使われません。Bash スクリプトをデバッグする際に間接参照のレベルを表示するために使われます。最初の文字が繰り返されて、レベルの深さを表します。

全てのプロンプトは、それぞれに対応する変数を設定することでカスタマイズできます (大抵は ~/.bashrc で設定します)。例えば:

PS2='> '

テクニック

プロンプトを普通の文字列に設定することもできますが、様々なテクニックを駆使することでプロンプトをもっとダイナミックに使いやすくすることができます。

Bash のエスケープシーケンス

プロンプトの文字列を表示するとき、Bash はバックスラッシュでエスケープされた特定の文字列を探し、特殊な文字列に展開します。例えば \u は現在のユーザー名になり \A は現在時刻になります。PS1 を '\A \u $ ' と設定すると 17:35 username $ といった具合に表示されます。

エスケープシーケンスの完全なリストは、bash(1) § PROMPTING man ページか Bash リファレンスマニュアルを参照してください。

Terminfo のエスケープシーケンス

Bash によって認識されるエスケープシーケンスの他に、大抵のターミナルは、文字を表示するのではなくターミナル自体に何らかの効果を与える特殊なエスケープシーケンスを認識します。例えば、表示される文字列の色を変更したり、カーソルを任意の場所に移動したり、画面を消去したりすることができます。これらのエスケープシーケンスは、どういうわけか読みにくい記述法を使用しており、ターミナルによって違うこともあります。なので、terminfo データベースでドキュメント化されています。ターミナルによってサポートされている機能を確認するには、次のコマンドを実行してください:

$ infocmp

機能の名前 (= よりも前の部分) は terminfo(5) の man ページを読めば何なのか説明を見ることができます。例えば setaf は出力されるテキストの前景色を設定します。特定の機能のエスケープシーケンスを出力するには、tput コマンドを使います。例:

$ tput setaf 2

上記のコマンドは前景色を緑に設定するエスケープシーケンスを表示します。

ノート: tput コマンドが失敗する場合、TERM 環境変数が正しく設定されているか確認してください。例えば xterm-256color ではなく xterm と設定していると tput setaf は0から7までの色番号しか扱えません。

Bash のコマンド置換と文字列補間を使用すれば、これらの機能を実際にプロンプトに組み込むことができます。例えば:

GREEN="\[$(tput setaf 2)\]"
RESET="\[$(tput sgr0)\]"

PS1="${GREEN}my prompt${RESET}> "
my prompt>
ノート: Bash の man ページでは、tput の出力を \[ \] で囲むことが推奨されています。こうすることにより、Bash は表示できない文字を無視するようになり、プロンプトのサイズを正しく計算できるようになります。この方法はコマンド置換では機能しないので、代わりに生の \1 \2 を使用しなければなりません。

ANSI のエスケープシーケンス

残念がら、ANSI のエスケープシーケンスはターミナルの terminfo データベースには載っていないことがあります。特に256色のサポートなど新しい機能のエスケープシーケンスはデータベースに入っていないことがよくあります。tput を使えない場合、エスケープシーケンスを手動で入力する必要があります。

エスケープシーケンスの例は Wikipedia:ANSI escape code を見てください。全てのエスケープシーケンスはリテラルのエスケープ文字から始まり、Bash のエスケープシーケンス \e を使って入力できます。例えば \e[48;5;209m は背景を桃色 (ターミナルが256色をサポートしている場合) に設定し、\e[2;2H はカーソルを画面左上に移動します。

Bash のエスケープシーケンスがサポートされていない場合 (PS3 など)、Bash の printf 組み込みコマンドを使うことでリテラルのエスケープ文字を使用できます:

ESC=$(printf "\e")
PEACH="$ESC[48;5;209m"

コマンドの埋め込み

何らかのコマンドの出力をプロンプトに追加したい場合、コマンド置換を使えばいいと思うかもしれません。例えば、空きメモリ容量をプロンプトに追加しようと以下のように設定した場合:

PS1="$(awk '/MemFree/{print $2}' /proc/meminfo) prompt > "
53718 prompt >
53718 prompt >
53718 prompt >

しかし、上記の設定は上手くいきません。表示されるメモリの容量はいつも同じになってしまいます。原因はコマンドの実行が一回しか行われず、PS1 が一度設定されると、二度と変わらないためです。$ をエスケープするかシングルクォートの中で定義するようにすることで、プロンプトが実際に表示されるときにコマンド置換がされるようになります:

PS1="\$(awk '/MemFree/{print \$2}' /proc/meminfo) prompt > "
# あるいは
PS1='$(awk "/MemFree/{print \$2}" /proc/meminfo) prompt > '

コマンドが長い場合は、関数を定義することで PS1 をコンパクトにできます:

free_mem()
{
    awk '/MemFree/{print $2}' /proc/meminfo
}

PS1='$(free_mem) prompt > '
ノート: 置換される関数の中で terminfo/ANSI のエスケープシーケンスを使うことはできますが、Bash のエスケープを使うことはできません。特に、\[ \] で出力不可能な文字列を囲んでも、期待通りに動作しません。代わりに8進数のエスケープ \001\002 を使ってください (例えば、printfecho -e を使うなどして)。

PROMPT_COMMAND

PROMPT_COMMAND 変数または配列が設定されている場合、PS1 が表示される直前に評価されます。これは、非常に強力な使い方ができます。例えば、条件式に応じて PS1 を再定義したり、コマンドを実行するたびに Bash の履歴に何らかの操作を加えたりできます。

ノート: 一般に、プロンプトに文字列を直接出力するために PROMPT_COMMAND を使用するべきではありません。PS1 の外で出力された文字列は Bash によってカウントされないため、カーソルの位置がおかしくなったり文字が消えたりしてしまう原因になります。PROMPT_COMMAND は PS1 を設定するために使用するか、#コマンドの埋め込み の方法を使ってください。
ヒント: PROMPT_COMMAND が複雑になりすぎてしまう場合、bash-preexec (Zsh のフック関数 preexecprecmd の Bash 版実装) を使えば管理しやすくなるかもしれません。

コマンドの入力完了と実行開始の間でエスケープシーケンス

PS1 の末尾でテキストのプロパティをリセットせずにそのままにしておくことで、Bash に入力したテキストにもそのプロパティを反映させることができます。例えば、PS1 の最後に tput blink を追加すると、入力されたコマンドが点滅します。ただし、エンターを押してもテキストのプロパティはリセットされないため、実行されたコマンドの出力にも影響が及びます。

PS0 にエスケープシーケンスを設定することで、コマンドを入力した後、かつそのコマンドが実行される前にそのエスケープシーケンスを挿入することができます。あるいは、コマンドが実行される直前に送信される Bash の DEBUG シグナルを捕捉することで、同じことをすることができます:

$ trap 'tput sgr0' DEBUG

root プロンプトのカスタマイズ

root で実行していることを知らせるために、root プロンプトはわかりやすいようにカスタマイズすると良いでしょう (赤字の点滅など)。root のホームディレクトリ (/root) を使うことで通常の Bash プロンプトのカスタマイズと同じようにカスタマイズできます。最初にスケルトンファイルの /etc/skel/.bash_profile/etc/skel/.bashrc/root にコピーしてから /root/.bashrc を編集してください。

サンプル

ヒント: infocmp は、tput で利用できる色の数を表示します。例: colors#8 (8つの色が利用可能)。

ターミナルでサポートされている色の完全な範囲は、tput を単純なループで回すことで確認できます (背景色ではなく前景色で表示するには setabsetaf に置き換えてください)。

for C in {0..255}; do
    tput setab $C
    echo -n "$C "
done
tput sgr0
echo

上記のコマンドが動かない場合 (そして、TERM に適切な値を設定しても問題が解決できない場合)、別のエスケープシーケンスでテストすることもできます:

# 標準色
for C in {40..47}; do
    echo -en "\e[${C}m$C "
done
# 高輝度色
for C in {100..107}; do
    echo -en "\e[${C}m$C "
done
# 256色
for C in {16..255}; do
    echo -en "\e[48;5;${C}m$C "
done
echo -e "\e(B\e[m"

エスケープシーケンスを背景色から前景色に変更したい場合は、標準色の範囲を 30..37 に、高輝度色の範囲を 90..97 にし、256色ではエスケープシーケンスの 48 の部分を 38 に変更してください。

一般的な機能

以下の terminfo の機能はプロンプトをカスタマイズするときに使うことができ多くのターミナルがサポートしています。#1#2 は実際に使うときに数字に置き換えてください。

機能 エスケープシーケンス 説明
テキストの属性
blink \e[5m テキストの点滅をオン
bold \e[1m 太字テキストをオン
dim \e[2m 淡色テキストをオン
rev \e[7m 逆転表示をオン (前景色と背景色が入れ替わります)
sitm \e[3m 斜字テキストをオン
ritm \e[23m 斜字テキストをオフ
smso \e[7m テキストのハイライトをオン
rmso \e[27m テキストのハイライトをオフ
smul \e[4m テキストの下線をオン
rmul \e[24m テキストの下線をオフ
setab #1 \e[4#1m 背景色を #1 (0-7) に設定
setaf #1 \e[3#1m テキスト色を #1 (0-7) に設定
sgr0 \e(B\e[m テキストの属性をリセット
カーソルの移動
sc \e7 カーソルの位置を保存
rc \e8 保存したカーソルの位置に戻す
clear \e[H\e[2J 画面をクリアし、カーソルを左上に移動
cuu #1 \e[#1A #1 行分だけカーソルを上に移動
cud #1 \e[#1B #1 行分だけカーソルを下に移動
cuf #1 \e[#1C #1 列分だけカーソルを右に移動
cub #1 \e[#1D #1 列分だけカーソルを左に移動
home \e[H カーソルを左上に移動
hpa #1 \e[#1G カーソルを #1 列目に移動
vpa #1 \e[#1d カーソルを #1 行目の1列目に移動
cup #1 #2 \e[#1;#2H カーソルを #1 行目の #2 列目に移動
文字列の削除
dch #1 \e#1P (バックスペースと同じように) 文字を #1 個削除
dl #1 \e#1M 行を #1 個削除
ech #1 \e#1X 文字を #1 個消去 (カーソルの移動は伴わない)
ed \eE[J 画面下端まで消去
el \e[K 行末まで消去
el1 \e[1K 行頭まで消去

終了コードの視覚化

コマンドの埋め込みと同じ方法で $? などの特殊な Bash 変数の補完を遅延させることができます。以下のプロンプトは前に実行したコマンドの終了コードを表示します:

PS1="\$? > "
# または
PS1='$? > '
0 > true
0 > false
1 >

条件式と関数を使うことでさらにわかりやすくすることができます:

exitstatus()
{
    if [[ $? == 0 ]]; then
        echo ':)'
    else
        echo 'D:'
    fi
}
PS1='$(exitstatus) > '
:) > true
:) > false
D: >

カーソルの位置

PS1 の中でカーソルを移動することで、プロンプトをパーツに分けてそれぞれを別々の場所に表示させることができます。しかし、カーソルと出力を正しい位置に表示させるために、プロンプトの表示が終わったらカーソルを元の場所に戻さなければなりません。tput の scrc という機能を使うことでカーソルの位置を保存して後で戻すことができます。カーソルを移動するプロンプトは、一般に以下のようになります:

PS1="\[$(tput sc; カーソル移動のコード) 移動されたプロンプト $(tput rc)\] 通常のプロンプト"

移動されたプロンプトは、Bash によって通常のプロンプトの一部として認識されないようにするために、\[ \] 内に記述します。

テキストを右寄せ

テキストを右寄せで表示させる最も単純な方法は、printf を使うことです:

rightprompt()
{
    printf "%*s" $COLUMNS "right prompt"
}

PS1='\[$(tput sc; rightprompt; tput rc)\]left prompt > '
left prompt > right prompt

上記のコードは、右寄せの可変長フィールド %*s を作成し、ターミナルの現在の列数 $COLUMNS に対して文字列のサイズを設定します。

任意の位置

cup 機能では画面の特定の位置にカーソルを移動できます。例えば tput cup 20 5 は20行目5列目にカーソルを移動します (0行目0列目が左上です)。cuu, cud, cuf, cub (上, 下, 右, 左) は現在の位置から相対的にカーソルを移動します。例えば tput cuf 10 はカーソルを10文字分だけ右に移動します。引数で LINESCOLUMNS 変数を使うことで下端と右端からの相対位置にカーソルを移動できます。例えば、右下から10行目5列目にカーソルを移動するには:

$ tput cup $((LINES - 11)) $((COLUMNS - 6))

ターミナルのウィンドウタイトルのカスタマイズ

プロンプトと同じ方法 (シェルにエスケープシーケンスを出力する) で、ターミナルのウィンドウタイトルをカスタマイすできます。なので、プロンプト内にウィンドウタイトルをカスタマイズするコードを含めるのは一般的です。これは技術で器には xterm の機能ですが、最近のターミナルの多くはこの機能をサポートしています。使用するエスケープシーケンスは ESC]2;new titleBEL です。ここで、ESCBEL はそれぞれエスケープ文字とベル文字です。Bash のエスケープシーケンスを使えば、以下のようにしてプロンプト内でタイトルを変更できます:

PS1='\[\e]2;タイトル\a\]prompt > '

もちろん、ウィンドウタイトルの文字列にはコマンドの出力結果$PWD などの変数を含めることができ、プロンプトが表示されるたびにタイトルを変化させることができます。

参照

翻訳ステータス: このページは en:Bash/Prompt customization の翻訳バージョンです。最後の翻訳日は 2023-10-14 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。