BashはSSHを介してrsyncのために実行されているかどうかを確認しますか?

BashはSSHを介してrsyncのために実行されているかどうかを確認しますか?

以下を区別するには、Bash initスクリプトが必要です。

  • ssh me@host /some/complicated/operationのような名前が呼び出されました。
  • こう呼ばれるrsync -e ssh /src me@host:/dest

最初のケースでは多くの初期化を実行したいのですが、2番目のケースでは常にスキップしたいと思います。これらのケースを区別するためにどの環境またはBash変数を使用できますか?

(注:これは自分で答えた質問です。)

答え1

上記のように(他の接続オプションなしで)sshを介してrsyncを呼び出すと、リモートsshdは次のようにサブプロセスを作成します(リモートホストのデフォルトシェルがbashであると仮定)。

bash -c rsync --server [-options] [--long-options] ...

シェルはinitファイルのソースなので、initファイルでシェル変数を使用できます

BASH_EXECUTION_STRING
      The command argument to the -c invocation option.

このように:

if [[ "$BASH_EXECUTION_STRING" == rsync\ --server\ * ]]; then return; fi

通常の(rsync以外の)SSH接続によって生成されたシェルは、このコマンドと一致しないため、正常に機能します。

答え2

対話型セッションが実行されていることを確認するためのソリューションを探している場合は、次のことが役に立ちます。

if [[ $- == *i* ]]
then
  echo "You are in interactive mode
else
  echo "Non-Interactive session"
fi

関連情報