ソースからコンパイルするときにBashが異なる動作をするのはなぜですか?

ソースからコンパイルするときにBashが異なる動作をするのはなぜですか?

私は走った

git clone https://git.savannah.gnu.org/git/bash.git
cd bash/
./configure
make
./bash

新しく起動した Bash インスタンスは、親シェル、特にシェルプロンプトを定義する PS1 変数から環境を継承していないことがわかりました。継承が適用されます/bin/bash

ソースファイル一覧/bin/bashと同じ./bash

./bash  -lixc exit 2>&1 | sed -n 's/^+* \(source\|\.\) //p'
/bin/bash  -lixc exit 2>&1 | sed -n 's/^+* \(source\|\.\) //p'

編集:aviroが述べたように、PS1はエクスポートせずに定義されているので、エクスポートしようとすると継承されたため、元の質問が間違っていました。私のコンピュータでは、PS1は2つのファイルで定義されています。 /etc/bash/bashrc

# If not running interactively, don't do anything
[[ $- != *i* ]] && return
[[ $DISPLAY ]] && shopt -s checkwinsize
PS1='[\u@\h \W]\$ '

そして/etc/bash/bashrc.d/artix.bashrc

if ${use_color} ; then
    if [[ ${EUID} == 0 ]] ; then
        PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] '
    else
        PS1='\[\033[01;36m\][\u@\h\[\033[01;37m\] \W\[\033[01;36m\]]\$\[\033[00m\] '
    fi
else
    if [[ ${EUID} == 0 ]] ; then
        # show root@ when we don't have colors
        PS1='\u@\h \W \$ '
    else
        PS1='\u@\h \w \$ '
    fi
fi

./bashPS1を実行するときの\s-\v\$理由がわかりません。

すべてのソースファイルを一覧表示するコマンドは、runを使用するときに両方のファイルがsource filesである必要があります./bashが、何らかの理由でそうでないか、シェルが別のタイプ/モードで起動されたことを示しています。なぜ?

ベストアンサー1

PS1まず、これが一般的であることを理解する必要があります。シェル変数、これは子供に継承されないことを意味します。したがって、環境変数を明示的に実行しexport PS1=...て生成しない限り、各新しいプロセスは親プロセスのPS1代わりにrcファイルからbash(および他のシェル変数)を取得します。したがって、まずPS1正確な定義がPS1どこにあるかを調べる必要があります。

次の方法でエクスポートできますPS1

export PS1

その後、実行すると、この場合は新しいシェルが継承される./bashことがわかります。PS1


それでは、コンパイルがbashrcファイルから期待するシェル変数を取得できないのはなぜですか?PS1

私の推測は次のとおりです。多くのシステムではPS1そうです/etc/bash.bashrc。ただし、すべてのbashバージョンでこのファイルを読み取ることはできません。bashコンパイル方法によって異なります。良い経験則は、bashマニュアルページを確認することです。例えば、Ubuntuあなたが見ることができるもの:

ログインシェルではなく対話型シェルを起動すると、bashは次のコマンドを読み取り、実行します。/etc/bash.bashrcそして、~/.bashrcこれらのファイルが存在する場合。--norc このオプションを使用すると、これを抑制できます。 fileオプションは、bashにファイルの代わりに--rcfileコマンドを読み込んで実行するようにします。/etc/bash.bashrc~/.bashrc

しかし、/etc/bash.bashrc本文には言及すらされません。bashマニュアルページ[git]からダウンロードしたもの:

ログインシェルではなくインタラクティブシェルを起動すると、bashは~/.bashrcファイルが存在する場合にコマンドを読み取り、実行します。--norcこのオプションを使用すると、これを抑制できます。 file--rcfileオプションはbashが ~/.bashrc

また、READMEDebianのドキュメントには次のものがありますbash

5. は何ですか/etc/bash.bashrc。記録がないようです。

Debian バージョンの bash は、読み取り優先エラーを発生させる特別なオプション ( ) を使用して-DSYS_BASHRCコンパイルされます。bash/etc/bash.bashrc~/.bashrc

そのため、git使用中のリポジトリで見ることができます config-top.h定義行はSYS_BASHRCデフォルトでコメントアウトされます。

/* System-wide .bashrc file for interactive shells. */
/* #define SYS_BASHRC "/etc/bash.bashrc" */

したがって、デフォルトのビルドは起動時にそれを読み取らbashず、そこで定義してもインポートされません。/etc/bash.bashrcPS1

この行のコメントを削除する場合:

#define SYS_BASHRC "/etc/bash.bashrc"

もう一度実行すると、新しいコンテンツに予想される変数が表示されますmakebashPS1

おすすめ記事