为什么当我通过 ssh 运行非交互式命令时,.bashrc 会被读取

为什么当我通过 ssh 运行非交互式命令时,.bashrc 会被读取

我在每个 bash 配置文件 ( ~/.bashrc、、)前面都添加了,例如,当我输入 时,我得到 '.bashrc ~/.bash_profile' 。~/.profileecho NAME_OF_FILE~/.bashrc

让我感到困惑的是,为什么当我通过 ssh 运行命令时,会提示包含 ~/.bashrc。例如,如果我这样做:

ssh localhost echo hi

我明白了

.bashrc
hi

为什么~/.bashrc在这种情况下要获取源代码?既然这应该运行非交互式 bash 会话,难道不应该获取源代码吗?

确实,ssh localhost tty我得到了一个“不是 tty”(前面是“.bashrc”,表明~/.bashrc尽管如此,它还是被获取了)。

我已经grep对所有配置文件进行了明确地命令采购~/.bashrc,但没有一个可以解释它。

(我只有tty -s && shopt -q login_shell && [[ -r ~/.bashrc ]] && . ~/.bashrc.bash_profile交互式登录 shell 中才会得到 '.bashrc',但这并不能解释 ssh 问题——我可以将其注释掉,但仍然会得到与上述 ssh 示例相同的行为)

我该如何调试它?

答案1

来自bash手册页:

Bash attempts to determine when it is being run with its standard input
connected to a a network  con‐nection,  as  if  by  the remote shell daemon,
usually rshd, or the secure shell daemon sshd.  If bash
determines it is being run in this fashion, it reads and executes commands
from  ~/.bashrc,  if  that file  exists and is readable.

当您通过 调用它时, IE~/.bashrc就会运行ssh,无论您是否有 tty。

如果您只希望.bashrc在交互时运行,请在顶部尝试以下操作:

# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return

如果这不起作用,请尝试这个:

[ -z "$PS1" ] && return

相关内容