web-dev-qa-db-ja.com

子bashの実行時にカスタマイズされたプロンプトが保持されない

私はbashを学んでいますが、その間に_.bash_profile_ファイルをいじって挨拶メッセージなどを入れることができました。後でこれらの変更を削除しました。しかし、それを行った後、プロンプトのデフォルト構成は失われました:元々、プロンプトはすべて太字で、_​​\w_部分は青色でした。私はそれがUbuntuのデフォルトだったと思います(間違っていれば私を修正します)が、それが失われ、私のプロンプトが太字ではなく単色であったため、長い名前のディレクトリにいるときに混乱します。

それで、昨夜、私は上記の方法でプロンプトをカスタマイズしようとしました。 _.bash_profile_にコードを追加した後、うまく機能しました

コードは次のようなものでした:

_export PS1="\[$(tput bold)\]\u@\h:\[$(tput sgr 0)\]\e[1;34m\w$ \e[m"
_

ただし、現在のシェルで別のbashシェルを実行しようとすると、プロンプトはフォーマットされなくなります。

それは正常ですか?変数をエクスポートして、そのシェルからフォークされたすべての子プロセスからアクセスできるようにすることの全体のポイントではありませんか?なぜこの状況に当てはまらないのですか?

4
etka

TL; DRPS1への呼び出しを~/.bashrcに入れるか、-lフラグでサブシェルを呼び出す

Zannaの答えは、PS1内の~/.bashrcを対話型シェルによってソースされるように設定することを適切に示唆しています。

ただし、-lフラグを使用して、サブシェルをログインシェルとして扱うことができます。

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ echo "PS1='TEST$ '" > ~/.profile

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash
xieerqi@eagle:~$ exit

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash -l
TEST$ 

「なぜ」

それは正常ですか?変数をエクスポートして、そのシェルからフォークされたすべての子プロセスからアクセスできるようにすることの全体のポイントではありませんか?なぜこの条件に当てはまらないのですか?

はい、それは予想される動作です。何かをエクスポートすると、変数はサブシェルに下向きに伝播するはずです。

xieerqi@eagle:~$ export VAR=303
xieerqi@eagle:~$ bash
xieerqi@eagle:~$ echo $VAR
303
xieerqi@eagle:~$ ksh
$ echo $VAR
303

問題は再び~/.bashrcです。 デフォルト~/.bashrcファイルには、PS1をオーバーライドする行があります。そのため、変数was exportedが、その後、対話型シェルが~/.bashrcをソースとして使用しました。この状況の例は、 nix Stackexchange の質問の1つで Gilles 'answer によって観察されています。

~/.profileに関しては、そこから環境変数を設定およびエクスポートすることが実際に推奨されており、頻繁に行われています。

一番最初のシェルが色付けされた理由に関するザンナのコメントに対処するために、私はこれが原因だと信じています:

Bashが対話型ログインシェルとして起動された場合。 。 。ファイル/ etc/profileが存在する場合は、最初にそのファイルからコマンドを読み取って実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profile、をその順序で検索し、コマンドを読み取って実行します存在し、読み取り可能な最初の1つ。 (bashのmanページから、強調が追加されました)

ログインすると、bash~/.bash_profileを見つけ、最初に見つかったファイルとして取得します。他のシェルは対話型の非ログインシェルであるため、~/.bashrcのみがソースになります。

5

.bash_profileは、ログインシェルのみから提供されます。 Xセッションにログインしたときに取得され、@ Sergが詳細に説明するように継承された環境です。どういうわけか、この環境が.bashrcによってオーバーライドされない構成を管理しており、おそらくデフォルトでログインシェルを開くように端末を設定しています。次のように端末を構成することで、あなたが経験した動作を再現できます。

これにより、シェルはログインシェルとして開かれますが、呼び出された子はすべて非ログインシェルになり、@ Sergが示唆するように.bashrcではなく、.bash_profileではなく-lをソースにしますフラグが使用されます。

TL; DR
カスタムプロンプトをインタラクティブシェルから取得する場合は、.bashrcにコードを入力します

6
Zanna