Bash - /etc/profile,登录时出现过多的只读变量消息

5
在Ubuntu Linux上,使用Bash登录时,我已经在/etc/profile中设置了只读变量。 下面是我的/etc/profile文件(我的添加在文件底部):
# Check for interactive bash and that we haven't already been sourced.
[ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION" ] && return

# Check for recent enough version of bash.
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
if [ $bmajor -gt 3 ] || [ $bmajor -eq 3 -a $bminor -ge 2 ]; then
    if shopt -q progcomp && [ -r /etc/bash_completion ]; then
        # Source completion code.
        . /etc/bash_completion
    fi
fi
unset bash bmajor bminor

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

TZ='America/Kentucky/Louisville'; export TZ

if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
  . $i
fi
done
unset i
fi

if [ "$PS1" ]; then
if [ "$BASH" ]; then
PS1='\u@\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
    . /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
  PS1='# '
else
  PS1='$ '
fi
fi
fi

 **# My Additions**

umask 077
shopt -s histappend
shopt -s histverify

export HISTFILE=~/.bash_history
export HISTFILESIZE=1000000000
export HISTSIZE=5000
export HISTCONTROL=""
export HISTIGNORE=""
export HISTTIMEFORMAT="%F %T"

readonly HISTFILE
readonly HISTFILESIZE
readonly HISTSIZE
readonly HISTCONTROL
readonly HISTIGNORE
readonly HISTTIMEFORMAT
readonly HISTCMD
readonly HOME
readonly PATH

echo -e "Subject: Login from $(/usr/bin/whoami) on $(/bin/hostname) at          $(/bin/date)\n\n$(/usr/bin/last -n 10 -F)\n" \
| /usr/sbin/ssmtp user@company.com

export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"'echo "$$ $USER $(history    1)"|/usr/bin/logger -p user.alert -t shell.log'
readonly PROMPT_COMMAND

以下是位于 /etc/profile.d 的 bash_completion 文件:

# Check for interactive bash and that we haven't already been sourced.
[ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION" ] && return

# Check for recent enough version of bash.
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
if [ $bmajor -gt 3 ] || [ $bmajor -eq 3 -a $bminor -ge 2 ]; then
if shopt -q progcomp && [ -r /etc/bash_completion ]; then
    # Source completion code.
    . /etc/bash_completion
fi
fi
unset bash bmajor bminor

我的问题是,当我登录时,在提示符出现之前,我会“淹没”大量的bash消息:

....
-bash: PATH: readonly variable
-bash: PATH: readonly variable
-bash: PATH: readonly variable
-bash: PATH: readonly variable
-bash: HISTFILE: readonly variable
-bash: HISTFILESIZE: readonly variable
-bash: HISTSIZE: readonly variable
-bash: HISTCONTROL: readonly variable
-bash: HISTIGNORE: readonly variable
-bash: HISTTIMEFORMAT: readonly variable
-bash: PROMPT_COMMAND: readonly variable

我的第一个问题是为什么会有这么多“PATH: readonly variable”消息,而且还带有完整的输出(15+)?我的第二个问题是如何停止这些消息在登录时显示。
提前感谢任何帮助!
1个回答

8

病人:“医生,我这样做会疼。”
医生:“不要那样做。”

不要将那些变量设置为只读。

你收到这些错误消息的原因是这些变量在执行 /etc/profile(例如 ~/.bashrc)之后的文件中被修改了。


我通过删除所有引用.bashrc的条目来解决了这个问题。我已经在/etc/profile中使用了.bashrc,所以每次读取.bashrc时它都会读取/etc/profile。我还删除了所有脚本中引用$PATH的行,除了/etc/profile之外。我达到了我想要的目标,即抵抗历史变量篡改,并消除了烦人的消息。 - jonschipp
1
@jonschipp - 没有任何限制可以阻止用户执行 bash --norc 命令或指定他们自己的 rc 文件。 - jordanm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接