Ubuntu 12.04を実行しています。
環境を設定するスクリプトがあります/etc/bash.bashrc
。
端末を開くと、Ctr+Alt+T
スクリプトは一度実行されます。しかし、別のボックスから私のコンピュータにSSHとして接続すると、/etc/bash.bashrc
initスクリプトが実行されますが、それでも実行されます。再び、なぜかわかりません。
他のユーザーも同じ「デュアル」初期化を経験します。これが必ずしも問題になるわけではありませんが、学術的な理由でこの問題を別々に分離したいと思います。
/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.bashrc
SSHログインに対して実行されると、他のスクリプト(通常~/.bash_profile
)がそのログインを取得することを意味します。サイト固有の環境変数の正しい場所は、スクリプト内または/etc/profile.d/
追加の項目にあります/etc/environment
。
ログインシェルとインタラクティブシェルについては、次を参照してください。ログインシェルと非ログインシェルの違いは何ですか?