web-dev-qa-db-ja.com

起動時にbashによって実行されているスクリプトを確認する

Bashターミナルを開始した後、PATH変数に重複したエントリが含まれていることに気付きました。私の端末はログインシェルを開始するので、~/.bash_profileがソースになり、その後に~/.profile~/.bashrcが続きます。 ~/.profileでのみ、重複するパスエントリを作成します。

わかりやすくするために、これはソースにする必要があるファイルがソースされる順序です。

Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc

これを「PATH変数に重複が含まれています」の重複としてマークする前に、読み続けてください。

最初は~/.profileが2回ソースされることに関係していると思ったので、ファイルが読み込まれるたびにログファイルにファイルを書き込みました。 。さらに意外なのは、~/.profileにあったエントリをコメントアウトしても、エントリがPATH変数に表示されることです。これにより3つの結論が導き出されましたが、そのうちの1つはすぐに除外されました。

  1. Bashは有効なbashコメントを無視し、コメント付きのコードを実行します
  2. ~/.profileを読み取り、出力を出力するコード(ログファイルなど)を無視するスクリプトがあります。
  3. 私の~/.profileの別のコピーが別の場所で提供されています

最初のものは、いくつかの簡単なテストのため、私はすぐにそうではないと結論しました。 2番目と3番目のオプションは、私がサポートを必要とするところです。

端末の起動時に実行されるスクリプトのログをどのように収集しますか?確認したファイルでechoを使用して、bashがソースであるかどうかを確認しましたが、端末が入力を開始する準備ができた時点で実行を追跡する決定的なメソッドを見つけるため。

上記が不可能な場合は、実行されているスクリプトを確認するために他の場所を探すことができます


今後の参考

これは、パスに追加するために今使用しているスクリプトです。

function add_to_path() {
    for path in ${2//:/ }; do
        if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
            new_path="$path:${!1#:}"
            export "$1"="${new_path%:}" # remove trailing :
        fi
    done
}

私はそれを次のように使用します:

add_to_path 'PATH' "/some/path/bin"

スクリプトは、パスを付加する前に、パスが変数にすでに存在するかどうかをチェックします。

Zshユーザーの場合、これと同等のものを使用できます。

function add_to_path() {
    for p in ${(s.:.)2}; do
        if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
            new_path="$p:${(P)1#:}"
            export "$1"="${new_path%:}"
        fi
    done
}

2018年8月8日を編集

このスクリプトで私ができることがもう1つわかったことは、パスも修正することです。そのため、.bashrcファイルの先頭で、次のようにします。

_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path

PATHの開始点はあなた次第です。最初にPATHを調べて決定します。

15
smac89

システムにstraceがある場合は、シェルを使用して開いたファイルを一覧表示できます。たとえば、

echo exit | strace bash -li |& grep '^open'

-liはインタラクティブなログインシェルを意味します。インタラクティブな非ログインシェルには-iのみを使用してください。)

シェルが開いた、または開こうとしたファイルのリストが表示されます。私のシステムでは、次のとおりです。

  1. /etc/profile
  2. /etc/profile.d/*/etc/profile.d/のさまざまなスクリプト)
  3. /home/<username>/.bash_profile(これは失敗します。そのようなファイルはありません)
  4. /home/<username>/.bash_login(これは失敗します。そのようなファイルはありません)
  5. /home/<username>/.profile
  6. /home/<username>/.bashrc
  7. /home/<username>/.bash_history(コマンドラインの履歴。これはスクリプトではありません)
  8. /usr/share/bash-completion/bash_completion
  9. /etc/bash_completion.d/*(オートコンプリート機能を提供するさまざまなスクリプト)
  10. /etc/inputrc(キーバインディングを定義します。これはスクリプトではありません)

詳細については、man straceを使用してください。

30
AlexP