web-dev-qa-db-ja.com

PS1シェル変数の正しい場所は何ですか?

私はクロスコンパイルされたLinux From Scratch-Embedded .In [3.3。環境の設定]で、PS1は.bash_profileファイルで宣言されています。実際には、ターミナルでは表示されません。

su - clfsとしてログインすると、.bash_profileファイルと.bashrcファイルの両方が実行されます。su clfsとしてログインすると、.bashrcファイルのみが実行されます。

どちらの場合も、ターミナルでPS1が更新されることはありません。

PS1を.bashrcファイルに配置すると、更新されます。

CLFSの本は.bash_profileファイルに次のように記述しています:

cat > ~/.bash_profile << "EOF"
exec env -i HOME=${HOME} TERM=${TERM} PS1='\u:\w\$ ' /bin/bash
EOF

それでは、PS1の適切な場所はどこですか?

4
Israr

PS1シェル変数は、初期化ファイルであるため、bashシェルの~/.bashrcに設定する必要があります対話型のシェルセッションで読み込まれます。

この変数はShell変数であり、環境変数ではないことに注意してください(子プロセスにその値を継承させることは意味がなく、現在のそれを使用するシェル)。したがって、exportでエクスポートする必要はありません。

関連:

シェルの起動ファイルからbashを起動する必要はありません。 ~/.profile(またはログインシェルに関連する対応するファイル)から特定のシェルを起動することは、実行中のシステムがログインシェルの変更を許可していない場合に保証される可能性があります。シェルが既にファイルを実行している場合は、他のシェルをしないように注意してください。そうしないと、ソートの無限ループが発生する可能性があります。 。

~/.bash_profileに追加するexecコードは必要ありません。 ~/.bashrcを解析する方法だと思います(インタラクティブなシェルを起動し、インタラクティブなbashシェルが~/.bashrcを読み取ります)。これを行うためのより良い方法は、たとえば~/.bash_profileでこれを使用するなど、ファイルの1つに他のファイルをソースさせることです。

if [[ -f $HOME/.bashrc ]]; then
    source "$HOME/.bashrc"
fi

次に、PS1~/.bashrcに設定します(HOMEまたはTERMをタッチする必要はありません)。

コマンドが行うもう1つのことは、env -iを使用して他のすべての環境変数を一掃することです。これを行う非常に具体的な理由がない限り、通常のシェル起動ファイルからそれを行うべきではありません。

13
Kusalananda

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.  The
--noprofile option may be used when the Shell is  started  to  inhibit  this
behavior.

When  a  login  Shell  exits, bash reads and executes commands from the file
~/.bash_logout, if it exists.

When an interactive Shell that is not a login Shell is started,  bash  reads
and  executes  commands  from /etc/bash.bashrc and ~/.bashrc, if these files
exist.  This may be inhibited by using the --norc option.  The --rcfile file
option  will  force  bash  to read and execute commands from file instead of
/etc/bash.bashrc and ~/.bashrc.

したがって、シェルの起動方法に大きく依存します。

  • PS1すべてのシェルでアクティブloginシェル(例:su - <user>またはssh)を介してリモートでログインする場合、それをprofileに入れます。
  • PS1すべてのシェルでアクティブnon-loginシェル(たとえば、単にデスクトップ環境で別の端末を開く)、bashrcに入れます。
  • 両方のケースでそれをアクティブにしたい場合は、両方のファイルに配置する必要があります、または(一部のLinuxフレーバーは、少なくともシステム全体の場合はこれを行います/ etc/profileおよび/ etc/bash.bashrc)、。profile。bashrcをソースします。
4
AdminBee

PS1.bashrcに含める必要があります。 .profileでも設定できます。

Debianはそこから.bashrcを入手します:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi
2
markgraf