新しいcygwin .bashrcインタラクティブチェックが機能しないのはなぜですか?

新しいcygwin .bashrcインタラクティブチェックが機能しないのはなぜですか?

私はCygwinを更新しましたが、新しいバージョンの.bashrc上部に次の行が含まれています。

echo "BEFORE TEST"
# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return
echo "AFTER TEST"

インタラクティブに実行しない限り、何もする必要はないことを知っていますが、次のsshコマンドを使用するかどうかについて質問があります。

ssh localhost pwd

私はこれを見る:

BEFORE TEST

したがって、明らかに[[ "$-" != *i* ]]テストに失敗して返されます。明らかにssh localhost pwdこれは簡単な例ですが、.bashrcコマンドを実行すると常に実行できるようにしたいですssh。私の実際の自動化はこのcygwinインスタンスに対してリモートでコマンドを実行しますが、パス.bashrc(myで設定)が正しく設定されていないため失敗します。

また、このテストが実際に何をしているのかを説明できる人はいますか?何ですかi$-それはどういう意味ですか?

答え1

pwd(あなたの場合)で単一のコマンドを実行すると、インタラクティブシェルではsshなく、動作が正しいと思います。

inではなくinPATHまたはに設定する必要があります。~/.profile~/.bash_profile~/.bashrc

見つかったとおりbash(1)マニュアルページ:

   パラメータ
      (...)
      特殊パラメータ
          シェルはいくつかのパラメータを特別に扱います。これらのパラメータは
          情報提供のみを目的として割り当てることはできません。
          (...)
          - 呼び出し時に指定された現在のオプションフラグに展開されます。
                 set 組み込みコマンドまたはシェル経由
                 (例:-iオプション)

したがって、iインクルードはオプションが使用されたことを$-意味します-i(または対話的にシェルによって自動的に設定されます)。

答え2

エンゾチップの回答そうですが(したがって投票)、SSHを介してシェルを起動するときは、シェルの起動に関する詳細で補完する必要があると思いました。

Bashドキュメントを読んでいる読者は、.bashrcBashがインタラクティブシェルで実行されていることを確認する必要がある理由を疑問に思います.bashrcインタラクティブ皮をすくいます。それにもかかわらず、~/.bashrcほとんどのUnixシリーズシステムには、現在シェルがインタラクティブであることを確認するために、デフォルトでいくつかの種類のチェック(テスト$-または)が含まれています。$PS1

その理由はBashにはリモートシェルのための特別なケースがあります。。非対話型Bashシェルは通常~/.bashrc起動時にコマンドを実行しませんが、シェルの起動時に特別な状況が発生します。リモートシェルデーモンによって呼び出された:

rshdBashは、リモートシェルデーモン(通常はシェルデーモン)やセキュアシェルデーモンによって実行されている場合など、ネットワーク接続に接続されている標準入力を使用して実行されていることを確認しようとしますsshd。 Bashがこのように実行されていると判断した場合、〜/ .bashrcはコマンドを読み取り、実行します(ファイルが存在して読み取れる場合)。として呼び出されると、これは行われませんsh

詳しくは、私の答えをご覧ください。bashrcが現在のシェルが対話型であることを確認するのはなぜですか?

関連情報