我需要我的 Bash 初始化脚本能够区分
- 已被调用
ssh me@host /some/complicated/operation
,如 和 - 被像这样调用
rsync -e ssh /src me@host:/dest
在第一种情况下,我想运行许多初始化,但在第二种情况下,我总是想跳过这些初始化。我可以使用什么环境或 Bash 变量来区分这些情况?
(注:这是一个自我回答的问题。)
答案1
如上所述通过 ssh 调用 rsync(没有其他连接选项)将导致远程 sshd 生成如下子进程(假设远程主机上的默认 shell 是 bash):
bash -c rsync --server [-options] [--long-options] ...
该 shell 是您的 init 文件的来源,因此在您的 init 文件中您可以使用 shell 变量
BASH_EXECUTION_STRING
The command argument to the -c invocation option.
像这样:
if [[ "$BASH_EXECUTION_STRING" == rsync\ --server\ * ]]; then return; fi
由常规(非 rsync)SSH 连接生成的 shell 将与此命令不匹配,因此会正常运行。
答案2
如果您正在寻找解决方案来确定是否正在运行交互式会话,这可能会有所帮助:
if [[ $- == *i* ]]
then
echo "You are in interactive mode
else
echo "Non-Interactive session"
fi