我需要我的 Bash init 脚本才能区分
ssh me@host /some/complicated/operation
,和rsync -e ssh /src me@host:/dest
在第一种情况下,我想运行许多初始化,但在第二种情况下,我总是想跳过这些初始化。我可以使用什么环境或 Bash 变量来区分这些情况?
(注意:这是一个自我回答的问题。)
如上所述通过 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 将与此命令不匹配,因此将正常运行。