InitスクリプトはSSHを介して2回実行されます。

InitスクリプトはSSHを介して2回実行されます。

Ubuntu 12.04を実行しています。

環境を設定するスクリプトがあります/etc/bash.bashrc

端末を開くと、Ctr+Alt+Tスクリプトは一度実行されます。しかし、別のボックスから私のコンピュータにSSHとして接続すると、/etc/bash.bashrcinitスクリプトが実行されますが、それでも実行されます。再び、なぜかわかりません。

他のユーザーも同じ「デュアル」初期化を経験します。これが必ずしも問題になるわけではありませんが、学術的な理由でこの問題を別々に分離したいと思います。

/etc/bash.bashrc実行時に通知するためにエコーを追加しました。最初はエコーが見えますが、2番目には他のものがスクリプトを実行していると信じさせるエコーは見えません。それが何なのかわかりません。~/.profile、、、~/.bashrcを確認しました。~/etc/profile

この動作は、ユーザーがSSHを介してコンピュータに接続されている場合にのみ発生することを強調したいと思います。インタラクティブ/ログイン/非ログインシェルの間にいくつかの違いがあることを知っていますが、まだ問題をよく理解していません。

ベストアンサー1

その環境設定スクリプトを呼び出すものを特定するには、使用されている場所ではなく、スクリプト内にトレースコマンドを追加する必要があります。

シェルスクリプトに含まれるスタックを報告する移植可能な方法はありません。 Bashでは、変数を介してこれを確認できますBASH_SOURCE。 Dashは実行中にソーススクリプトを開いたままにしているため、開いているファイルを一覧表示すると良いアイデアが得られます。 bashはデフォルトの対話型シェルで、dashはデフォルトのスクリプトシェルなので、ほとんどの場合に適用されます。

if [ -n "$BASH_SOURCE" ]; then
  eval 'echo "${BASH_SOURCE[@]}"'
else
  readlink /proc/$$/fd/[4-9] 2>/dev/null
fi

(これはshの構文エラーなので、${BASH_SOURCE[@]}後ろに保護されています。)eval


気づく.bashrcまたは/etc/bash.bashrc環境変数の位置が正しくありません。。これはbashの対話型の非ログインインスタンスによってのみ実行されます。特に、SSH ログインに対しては実行されません。/etc/bash.bashrcSSHログインに対して実行されると、他のスクリプト(通常~/.bash_profile)がそのログインを取得することを意味します。サイト固有の環境変数の正しい場所は、スクリプト内または/etc/profile.d/追加の項目にあります/etc/environment

ログインシェルとインタラクティブシェルについては、次を参照してください。ログインシェルと非ログインシェルの違いは何ですか?

おすすめ記事