为什么ssh远程命令读取bashrc文件?

为什么ssh远程命令读取bashrc文件?,bash,shell,Bash,Shell,根据一份报告,它说: 当启动非登录shell的交互式shell时,Bash从~/.bashrc读取并执行命令(如果该文件存在) 我做了一个快速测试: 在我的服务器上 [USER@MYSERVER ~]$ cat .bashrc ... echo 'I am in a bashrc file of my server' ... 在远程服务器上 # unquoted [USER@REMOTESERVER ~]$ ssh MYSERVER echo $- I am in a bashrc fil

根据一份报告,它说:

当启动非登录shell的交互式shell时,Bash从~/.bashrc读取并执行命令(如果该文件存在)

我做了一个快速测试:

在我的服务器上

[USER@MYSERVER ~]$ cat .bashrc
...

echo 'I am in a bashrc file of my server'

...
在远程服务器上

# unquoted
[USER@REMOTESERVER ~]$ ssh MYSERVER echo $-
I am in a bashrc file of my server
himBH

#quoted
[USER@REMOTESERVER ~]$ ssh MYSERVER 'echo $-'
I am in a bashrc file of my server
hBc
当命令不带引号时,它似乎在交互式shell中运行,而当带引号时,它似乎在非交互式shell中运行

为什么会这样

并且都读取MYSERVER的bashrc文件,该文件不符合中的规则

任何链接或评论感谢


编辑:

它似乎是一个非登录shell

[USER@REMOTESERVER ~]$ ssh MYSERVER 'shopt -q login_shell && echo 1 || echo 2'
2

远程bash确实不是作为交互式shell启动的(正如我们从
$-
的输出中看到的那样),因此必须从其他方面寻找.bashrc。当然,它是作为登录shell运行的。可能是您有一个~/.bash_配置文件或~.bash_登录名或~/.profile,它显式地来源于.bashrc?

,其中说:

由远程shell守护程序调用

Bash试图确定何时在其标准输入连接到网络连接的情况下运行它,就像由远程shell守护程序(通常是rshd)或安全shell守护程序sshd执行一样。如果Bash确定它是以这种方式运行的,那么它将从~/.bashrc读取并执行命令(如果该文件存在且可读)

我错过了这部分

因此,从ssh调用应该读取
.bashrc
文件


正如问题的注释所解释的,ssh远程命令是一个非交互式shell。

当命令未被引用时,它似乎在交互式shell中运行,
否,
$-
未被引用。。。它在您的计算机上展开,您正在运行一个交互式shell。至于包含.bashc,您的
~/.bash\u个人资料、~/.bash\u登录名和~/.profile、
是否阅读了您的.bashrc?@KamilCuk您能详细说明一下吗?ssh HOST command/ssh HOST'command'之间有什么区别?@yoon在执行命令之前,shell会展开(即替换)任何非单引号(或转义)的
$
表达式。因此,当您运行
ssh MYSERVER echo$-
时,shell首先将
$-
扩展为“himBH”,然后运行
ssh MYSERVER echo himBH
。因此,远程shell运行的是
echo himBH
,而不是
echo$-
。另外,按照卡米尔库克的建议检查你的.bash_档案等。@GordonDavisson:对,但我认为这不是重点。如您所见,第二个示例中的
$-
显示了远程端的
hBc
,从中我们可以得出结论,它不是交互式的(它缺少
i
)。在这种情况下,我确实会得出结论,默认情况下,
.bashrc
不应来源。这就是我所怀疑的——请参阅我的答案。是的,bash_profile来源于bashrc文件。当我运行
ssh MYSERVER'shopt-q login_shell&&echo 1 | | echo 2'
时,会打印
2
,因此它似乎不是登录shell。我说得对吗?