shopt -s expand_aliases
ttmp="SUCCESS"
alias aliased_command='echo $ttmp'
我可以通过将以上行添加到 .bashrc 文件来远程使用别名。
[USER@REMOTESERVER ~]$ ssh MYSERVER aliased_command
SUCCESS
当 shell 非交互式时,别名不会展开,除非使用 shopt 设置 Expand_aliases shell 选项
expand_aliases
选项允许非交互式 shell 使用别名。
但是,当我运行时:
[USER@REMOTESERVER ~]$ ssh MYSERVER echo $-
himBH
看来通过 ssh 运行远程命令正在使用交互式 shell。(i
包含)
这是正确的吗?
如果正确,为什么需要 Expand_aliases 选项?
如果错误,如果ssh SERVER COMMAND
使用非交互式 shell,为什么ssh MYSERVER COMMAND
读取.bashrc
MYSERVER 的文件时非交互式 shell 不读取.bashrc
文件?
cf) 引用命令会产生不同的输出
[USER@REMOTESERVER ~]$ ssh MYSERVER 'echo $-'
hBc
任何链接,评论赞赏。
答案1
至少有两个方面:
1. 引用
未加引号的内容$-
由您扩展当地的壳。请注意,本地ssh
可以根据它获取的多个参数构建 shell 代码(以在远程端运行)。当你这样做时ssh MYSERVER echo $-
,远程 shell 就得到了echo himBH
。该himBH
字符串来自您的本地 shell。当你这样做时ssh MYSERVER 'echo $-'
,远程 shell 就得到了echo $-
。
看如何通过 ssh 执行复杂的命令行以及我的回答。我不会在这里重复所有内容。最重要的事情:
为了控制远程 shell 将获得的内容
$command_line_built_by_ssh
,您需要理解、预测和策划之前发生的解析和解释。您需要制作本地命令,所以后本地 shell 并消化它,它就变成了您想要在远程端执行的ssh
确切内容。$command_line…
ssh
一个好的方法是将精确的(远程)命令作为单个参数传递给本地。这就是您所做的ssh MYSERVER 'echo $-'
,单引号阻止了本地扩展。$-
在远程 shell 的上下文中未加引号。
结果hBc
来了从远程 shell。远程 shell 不是交互式的。
2. Bash 试图变得聪明
关于非交互式 shell 采购.bashrc
,请参阅这是我的另一个答案:
第 2 个扭曲:Bash 尝试确定它何时在其标准输入连接到网络连接的情况下运行,就像由 SSH 服务器执行时一样。如果 Bash 确定它正在以这种方式运行,它会读取并执行来自 的命令
~/.bashrc
。
您链接到bash 文档。我所说的是“由远程 shell 守护进程调用”。还有更多曲折,请参阅完整链接的答案。