🫠

Terminalのプロンプトをカスタマイズする( シェル・環境変数設定ファイルについて)

2024/12/22に公開

##記載内容
シェル変数および環境変数
プロンプトのカスタマイズの仕方

##プロンプトのカスタマイズの仕方
プロンプトの表示形式をlinuxおよびlinux likeのOSで決定するのはPS1。
現在設定されている変数を確認する。

~ % echo $PS1
%n@%m %1~ %# 

各文字の意味は以下のサイトを参照。
bash
[zsh]
(https://it-syoya-engineer.com/zsh-prompt-setting/)

そのため、以下でPS1を設定。

PS1='%n@%m[%W %t] %d %#'

そして再起動すると、プロンプトが以下の通り変化。

username@hostname [12/22/24 10:05AM] /Users/kyoya %

しかしこのままではexitしたら元に戻ってしまう。
##設定ファイルに直接設定
上記が戻らないよう、シェルが起動するたびに読み込む設定ファイルに変数定義を記載しておく。
シェルが読み込む設定ファイルとその順序は以下のサイトを参照。
bash,zshにおける設定ファイルの読み込み順序について
自身の環境のホームディレクトリには.zprofileしかなかったため、新たに.zshrcをtouchし、viで編集した。(最初.zprofileを編集しても何もプロンプトが変わらず焦った。/etc/zshrcがいたことが原因だった)
それによってプロンプトのカスタマイズが永久化できた。

##残る疑問
当変更をするにあたり、「新しいLinuxの教科書」8章を参考にしたのだが、そこにシェル変数と環境変数の違いが記載してあった。
シェル変数は組み込みコマンドからしか参照できないと記載されていた。
そのためビルトインコマンドであるlsで挙動を確認してみた。

username@hostname ~ % var2='important'
username@hostname~ % ls $var2
accountopen.html
username@hostname ~ % type ls
ls is /bin/ls

ここで、シェル変数でもlsで参照できるのがいまいち不明だった。
GPTさんに聞いたら以下だったが、逆に外部コマンドからシェル変数を参照する機会のイメージがあまりわかなくなってしまった。
スクリプトとかを書くようになればわかるのかな。

lsが外部コマンドであるにもかかわらず、シェル変数($var2)を利用して動作している理由は、シェルが変数を外部コマンドに渡す前に解釈しているからです。

仕組みの詳細
シェル変数の展開

コマンドラインで ls $var2 と入力すると、シェルはまず $var2 を解釈して、その値を展開します。
例えば、var2='important' であれば、シェルはコマンドを次のように置き換えます:
bash
コードをコピーする
ls important
展開後に外部コマンドが実行される

シェルが展開を終えた後、そのコマンド(この場合は ls)が外部コマンドとして実行されます。
この時点で、ls は展開済みの文字列 important を引数として受け取ります。
type ls の結果

type ls の結果が ls is /bin/ls であるため、ls が外部コマンドであることは正しいです。
ただし、シェル変数の解釈(展開)は外部コマンドの実行よりも前の段階で行われるため、ls 自体がシェル変数を直接認識しているわけではありません。
補足: 内部コマンドと外部コマンドの違い
内部コマンド
シェルが直接実行するコマンド(例: cd、echo、set)はシェルの文法や変数をネイティブに扱います。

外部コマンド
シェルが処理を外部のプログラム(例: /bin/ls, /usr/bin/find)に委託しますが、外部コマンドの実行前にシェルが変数展開やパスの解釈を行います。

Discussion