私が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から
、シェルは、おそらく、インタラクティブであっても、ローカルマシンかかわらず、それをユーザーインタラクティブにしていません。リモートシェルのコマンドライン引数を確認できますか? –
'.bash_profile'の出力は何ですか?私はちょうど 'if [-f〜/ .bashrc]のようなものを探しています。 。 〜/ .bashrc fi'を実行し、ログイン時に '.bashrc'を起動します。 – Ewan
@kisamoto: '.bash_profile'はログインシェルに対してのみ実行されます。 –