解決策 1:
代わりにこれを試してください
if [ "$SSH_TTY" ]
then
source .bashc_real
fi
解決策 2:
マイクの答えはおそらくうまくいくでしょう。ただし、詳細な情報を入れるスタートアップ ファイルを慎重に選択することで、これを達成できることを指摘しておく価値があります。bash の man ページから:
<ブロック引用>bash が対話型ログイン シェルとして、または --login オプションを指定した非対話型シェルとして呼び出されると、最初にファイル /etc/profile からコマンドを読み取り、実行します (そのファイルが存在する場合)。そのファイルを読み取った後、~/.bash_profile、~/.bash_login、および ~/.profile をこの順序で検索し、最初に存在して読み取り可能なコマンドからコマンドを読み取って実行します。 --noprofile オプションは、シェルの起動時にこの動作を禁止するために使用できます。
ログイン シェルではないインタラクティブ シェルが開始されると、bash は ~/.bashrc ファイルが存在する場合はそこからコマンドを読み取り、実行します。これは、 --norc オプションを使用することで抑制できます。 --rcfile file オプションは、~/.bashrc ではなく、ファイルからコマンドを読み取って実行するように bash を強制します。
sftp/scp ツールはインタラクティブな非ログイン シェルを開始するため、.bashrc が読み込まれます。多くのディストリビューションは .bash_profile から .bashrc をソースとしているか、またはその逆であるため、混乱する可能性があります。ログイン環境のクリーン度をテストするための良い方法は、scp/sftp 接続と同じ方法をシミュレートするコマンドで ssh することです。例:ssh myhost /bin/true
接続時に scp/sftp が認識する内容を正確に表示します。
簡単なデモ:
[email protected]:~$ echo "echo Hello from .profile" > .profile
[email protected]:~$ echo "echo Hello from .bashrc" > .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$
[email protected]:~$ rm .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$
最初のテストでは、scp/sftp/rsync などが壊れます。 2 番目のバージョンは問題なく動作します。
解決策 3:
csh を使用している場合:
if ($?prompt)
... interactive stuff ...
bash の場合:
if [[ $- == *i* ]]; then
... interactive stuff ...
fi
または代わりに bash 正規表現を使用:
if [[ $- =~ i ]]; then
... interactive stuff ...
fi
これらの行は、何かを出力/エコーする行の前に置く必要があります。