由于 ssh 上的 rsync,Bash 如何确定它是否正在运行?

dg9*_*g99 3 ssh rsync bashrc

我需要我的 Bash init 脚本才能区分

  • 具有被调用等ssh me@host /some/complicated/operation,和
  • 像这样被调用 rsync -e ssh /src me@host:/dest

在第一种情况下,我想运行许多初始化,但在第二种情况下,我总是想跳过这些初始化。我可以使用什么环境或 Bash 变量来区分这些情况?

(注意:这是一个自我回答的问题。)

dg9*_*g99 6

如上所述通过 ssh 调用 rsync(没有其他连接选项)将导致远程 sshd 产生这样的子进程(假设远程主机上的默认 shell 是 bash):

bash -c rsync --server [-options] [--long-options] ...
Run Code Online (Sandbox Code Playgroud)

这个 shell 是你的 init 文件的来源,所以在你的 init 文件中你可以使用 shell 变量

BASH_EXECUTION_STRING
      The command argument to the -c invocation option.
Run Code Online (Sandbox Code Playgroud)

像这样:

if [[ "$BASH_EXECUTION_STRING" == rsync\ --server\ * ]]; then return; fi
Run Code Online (Sandbox Code Playgroud)

由常规(非 rsync)SSH 连接生成的 Shell 将与此命令不匹配,因此将正常运行。