2013-05-14 20 views
5

私がbashのマンページを読んでいるとき、.bashrcは、シェルが対話的に実行されたときにのみ実行されるべきです。マンページは、インタラクティブ定義:対話型シェルが1であるsshでコマンドを実行すると、.bashrcも実行されますか?

非オプションの引数なしで開始 とその標準入力と誤差(isatty(3)により決定される)の両方の端子に接続され -Cオプションなし、または-iオプションを指定して を起動した場合bashが 対話型の場合はPS1が設定され、$ - iはシェルスクリプトまたは起動ファイルが の状態をテストできるようにします。

しかし、sshでコマンドを実行すると、コマンドが対話形式で実行されていないことを前提として、.bashrcが実行されます。だから、この動作はバグのようだが、Red Hatのすべてのバージョンとbashにも普及しているようだ。誰かがこの動作が正しい理由を説明できますか?

1つの追加ポイント:.bashrcが実行されても、シェルが非対話的であるかのように設定されています(予想通りですが、$-と、および$PS)。

$ grep USER /etc/passwd 
USER:x:UID:GID:UNAME:/home/USER:/bin/bash 

$ cat ~/.bashrc 
echo bashrc:$-,$PS1 

$ bash -c 'echo $-' 
hBc 

$ ssh localhost 'echo $-' </dev/null 2>/dev/null 
[email protected]'s password: 
bashrc:hBc, 
hBc 

$ ssh localhost 'ps -ef | grep $$' </dev/null 2>/dev/null 
[email protected]'s password: 
bashrc:hBc, 
USER 28296 28295 0 10:04 ? 00:00:00 bash -c ps -ef | grep $$ 
USER 28297 28296 0 10:04 ? 00:00:00 ps -ef 
USER 28298 28296 0 10:04 ? 00:00:00 grep 28296 

私は現在の.bashrcに[[ $- = *i* ]]をテストすることによってこの問題を回避働いていますが、私はそれを行う必要はありませんかのように思えます。 bashrcに(との.ssh)よりも私のホームディレクトリには他のファイルを含まない

一例としてサーバは、この構成を有している:私は上でこれを試してみたのbashの

$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.7 (Tikanga) 

$ bash --version 
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 
Copyright (C) 2005 Free Software Foundation, Inc. 

バージョン:3.00.15、 3.1.17,3.2.25,4.1.2(Red Hat 6.3の後者)。 Bash manualから

+0

、シェルは、おそらく、インタラクティブであっても、ローカルマシンかかわらず、それをユーザーインタラクティブにしていません。リモートシェルのコマンドライン引数を確認できますか? –

+0

'.bash_profile'の出力は何ですか?私はちょうど 'if [-f〜/ .bashrc]のようなものを探しています。 。 〜/ .bashrc fi'を実行し、ログイン時に '.bashrc'を起動します。 – Ewan

+0

@kisamoto: '.bash_profile'はログインシェルに対してのみ実行されます。 –

答えて

3

バッシュは、リモートシェルデーモン、通常rshd、またはセキュアシェルデーモンによって実行されたときのように、ネットワーク接続に接続された標準入力で実行されている時を決定することを試みますsshd。 Bashがこの方法で実行されていると判断した場合、そのファイルが存在し、読み込み可能であれば、~/.bashrcからコマンドを読み込んで実行します。これは、shとして呼び出された場合はこれを行いません。 --norcオプションを使用してこの動作を禁止し、--rcfileオプションを使用して別のファイルを強制的に読み込むことができますが、rshdは通常、これらのオプションでシェルを起動したり、指定することはできません。

デフォルトのDebian bashrc骨格に回避策は.bashrcの先頭に次置くこ​​とです:リモートマシンの観点から

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 
+0

これは現在のマンページでご覧になれます。私は対話型シェルのための.bashrcの記述によって混乱しました: "〜/ .bashrc:個々の対話型シェル起動ファイル"。 –

関連する問題