【小ネタ】CloudShell でプロンプトを変える方法
こんにちは、猫とアポロチョコと Systems Manager が好きな、テクニカルサポートの m.hayakawa です。
CloudShell 使っていますか?
EC2 を起動せずに、マネジメントコンソールから直接シェルが起動できて、ログイン中の IAM ユーザー(またはIAMロール)の権限を用いて、AWS CLI コマンドも実行できる優れものです。
デフォルトではプロンプトは、ユーザー名@IPアドレス ディレクトリ$
となっています。
これを変えたくなったので、今回、小ネタとしてブログ記事にします。
始めに結論
結論から書くと、~/.bash_profile に環境変数 PS1 を定義するコード追記をします。ユーザー名、時間、ディレクトリを表示したい場合は、下記のように指定してください。
if [ "$PS1" ]; then PS1="[\u@\t \w]\$ " fi
私は検証時にコマンド実行時刻を記録したいため、このようにしてみました。
[cloudshell-user@02:22:45 ~]$
CloudShell が bash ファイルを読み込む順番について
初めて起動するときには、このような画面になります。
man bash コマンドで仕様を確認します。
When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.
これによると、/etc/profile を読み込んだあと、 ~/.bash_profile が存在していれば、それを読み込んで実行するという仕様になっているようです。
デフォルトでは、プロンプト環境変数 PS1 はこのようになっていました。
[cloudshell-user@ip-10-4-50-6 ~]$ echo $PS1 [\u@\h \W]\$
この環境変数はどこに定義されているかをチェックしたところ、/etc/bashrc に記載がありました。
bash.rc より一部抜粋
# /etc/bashrc # System wide functions and aliases # Environment stuff goes in /etc/profile # It's NOT a good idea to change this file unless you know what you # are doing. It's much better to create a custom.sh shell script in # /etc/profile.d/ to make custom changes to your environment, as this # will prevent the need for merging in future updates. # are we an interactive shell? if [ "$PS1" ]; then if [ -z "$PROMPT_COMMAND" ]; then case $TERM in xterm*|vte*) if [ -e /etc/sysconfig/bash-prompt-xterm ]; then PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then PROMPT_COMMAND="__vte_prompt_command" else PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' fi ;; screen*) if [ -e /etc/sysconfig/bash-prompt-screen ]; then PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen else PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' fi ;; *) [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=/etc/sysconfig/bash-prompt-default ;; esac fi # Turn on parallel history shopt -s histappend history -a # Turn on checkwinsize shopt -s checkwinsize [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ " # You might want to have e.g. tty in prompt (e.g. more virtual machines) # and console windows # If you want to do so, just add e.g. # if [ "$PS1" ]; then # PS1="[\u@\h:\l \W]\\$ " # fi # to your custom modification shell script in /etc/profile.d/ directory fi
41行目 にて、PS1 がデフォルト値(\\s-\\v\\\$
)の場合に、[\u@\h \W]\\$
が適用されるといった記述がありました。
etc/bashrc は ~/.bash_profile の後に実行される挙動になっているため、~/.bash_profile でデフォルトから書き換えてしまえばよさそうです。
補足
全ユーザーに同一の環境変数を適用させるには、/etc/profile.d/ 内に sh ファイルを作成して、環境変数を定義することが考えられます。
~/.bash_profile で PS1 の値を設定する
PS1 は表示上の可読性に寄与するため、ユーザーごとの変更でよさそうです。そのため、冒頭記載のように下記を追加することで PS1 の値を設定できます。
if [ "$PS1" ]; then PS1="[\u@\t \w]\$ " fi
おわりに
小ネタのつもりで書き始めましたが、bash の設定ファイルはどういう順番で読み込むのだろうと悩むシーンがあったので、再勉強の機会になってよかったです。
どこかの誰かにお役に立てたら幸いです。