在我阅读bash联机帮助页时,只应在以交互方式运行shell时执行.bashrc.该联机帮助页将交互定义为:
交互式shell是在没有非选项参数的情况下启动的,没有-c选项,其标准输入和错误都连接到终端(由isatty(3)确定),或者以-i选项开头.如果bash是交互式的,则设置PS1和$ - 包括i,允许shell脚本或启动文件测试此状态.
然而,使用ssh执行命令也会导致运行.bashrc,这与我期望的相反,因为该命令不是以交互方式运行的.所以,这种行为看起来像一个bug,但它似乎在我尝试过的Red Hat和bash的所有版本上都很普遍.有人能解释为什么这种行为是正确的吗?
还有一点:即使.bashrc运行,$-并且$PS设置好像shell是非交互式的(正如我所料).
$ grep USER /etc/passwd
USER:x:UID:GID:UNAME:/home/USER:/bin/bash
$ cat ~/.bashrc
echo bashrc:$-,$PS1
$ bash -c 'echo $-'
hBc
$ ssh localhost 'echo $-' </dev/null 2>/dev/null
USER@localhost's password:
bashrc:hBc,
hBc
$ ssh localhost 'ps -ef | grep $$' </dev/null 2>/dev/null
USER@localhost's password:
bashrc:hBc,
USER 28296 28295 0 10:04 ? 00:00:00 bash -c ps -ef | grep $$
USER 28297 28296 0 10:04 ? 00:00:00 ps -ef
USER 28298 28296 0 10:04 ? 00:00:00 grep 28296
Run Code Online (Sandbox Code Playgroud)
我目前正在通过[[ $- = *i* ]]在.bashrc中进行测试来解决这个问题,但似乎我不应该这样做.
一个示例服务器,在我的主目录中不包含.bashrc(和.ssh)中的其他文件具有以下配置:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)
$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
我尝试过的bash版本:3.00.15,3.1.17,3.2.25,4.1.2(后者在Red Hat 6.3上).
来自Bash 手册:
Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如何时由远程 shell 守护程序(通常为 )
rshd或安全 shell 守护程序执行sshd。如果 Bash 确定它正在以这种方式运行,那么它会从 读取并执行命令~/.bashrc(如果该文件存在并且可读)。如果作为 sh 调用,则不会执行此操作。该--norc选项可用于禁止此行为,并且该--rcfile选项可用于强制读取另一个文件,但rshd通常不会使用这些选项调用 shell 或允许指定它们。
默认 Debian 框架中的解决方法bashrc是将以下内容放在 的顶部.bashrc:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2193 次 |
| 最近记录: |