我正在尝试创建一个全局计数器变量来查看执行了多少次~/.profile
。因此:
在~/.bashrc
:
# ...
if [ "$PROFILE_EXEC_TIMES" = "" ]; then
export PROFILE_EXEC_TIMES=0
fi
let "PROFILE_EXEC_TIMES += 1"
在~/.profile
:
# ...
export PROFILE_EXEC_TIMES
let "PROFILE_EXEC_TIMES += 1"
但是当我打开一个新 shell 并写入时echo $PROFILE_EXEC_TIMES
,我得到的只是1
。 $PROFILE_EXEC_TIMES
必须至少为 2。我猜测这~/.profile
不是由 bash 提供的...如果是,我需要做什么才能检查~/.profile
执行了多少次?
编辑:
我注意到,这是通过以下方式/etc/gdm/Xsession
获取的:~/.profile
test -f "$HOME/.profile" && . "$HOME/.profile"
并~/.bashrc
来源于~/.profile
以下几行:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
~/.bashrc
另外,我在&中添加了以下行~/.profile
:
echo $(cd ${0%/*} && echo $PWD/${0##*/}) >> /home/myUserName/a
并且可以看到在我登录到我的用户后,文件中只添加了一行。
我想强调的是,我的目标是:
查明~/.profile
用户登录时执行了多少次。
额外细节:
$ uname -a
Linux my-desktop 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux
$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.1 LTS"
答案1
从您对我原始答案的评论来看,您真正的问题是“~/.profile 是否源自 GNOME?”答案是肯定的。查看/etc/gdm/Xsession
:
# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"
原始答案
来自 bash 的手册页:
当 bash 作为交互式登录 shell 或使用 --login 选项作为非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找
~/.bash_profile
、~/.bash_login
和~/.profile
,然后从第一个存在且可读的文件中读取并执行命令。
因此,您的主目录中可能有一个名为 .bash_profile 或 .bash_login 的文件。如果其中任何一个存在,bash 将使用它而不是 .profile。
答案2
首先,如果你想观察 shell 脚本中发生的事情,请将其放在set -x
顶部(#!
如果有的话,就在行之后)。这会在标准错误上打印执行的踪迹。这里 shell 的标准错误应该重定向到~/.xsession-errors
。
你的问题中有一个矛盾:你说你的目标是“找出用户登录时 ~/.profile 执行了多少次”,然后你继续用 进行破解.bashrc
。仅仅输入export PROFILE_EXEC_TIMES; let "PROFILE_EXEC_TIMES += 1"
你的.profile
确实会计算它被执行了多少次,结果为 1(你只登录了一次)也就不足为奇了。
您的.profile
来源.bashrc
很奇怪,因为.profile
它在登录时使用,并且.bashrc
在 bash 交互时是其配置文件。也许您这样做是为了解决 bash 中的设计错误,即它无法读取既是.bashrc
登录 shell 又是交互 shell;我更喜欢有一个.bash_profile
既是来源.profile
又是来源的(如果 shell 是交互的).bashrc
。
请注意,如果 shell 不是 bash,则.profile
不要使用 source 。这解释了为什么登录时不会读取:由 执行,在 Ubuntu 10.04 上是.bashrc
.bashrc
/etc/gdm/Xsession
/bin/sh
短跑,而不是 bash。
在 的顶部附近.bashrc
,您有:“如果不是以交互方式运行,则不执行任何操作”注释了 行[ -z "$PS1" ] && return
。实际上,该行不会这样做;PS1
在非交互式 shell 中设置 是相当常见的(例如,它由 进行设置/etc/profile
)。交互式 bash 的可靠测试是[[ $- = *i* ]]
。
您也可能对。。。有兴趣.bashrc 和 .bash_profile 之间的区别。
答案3
@Dor:我还没有足够的声誉来发表评论,但我可以回答你 2010 年 12 月 7 日 12:41 的最后一条评论,即:
“当我将代码附加到两个文件并登录 GNOME 时,Xsession.log 文件中仍然只有一行(每次登录前 Xsession.log 文件都是空的)。这是为什么?后一种情况下应该至少有两行。”
不会,因为当您登录 Gnome(使用 GDM)时,~/.bashrc
不会执行,只会执行~/.profile
。正如 Gilles 所解释的那样,Gnome 会调用/etc/gdm/Xsession
,而后者又会调用~/.profile
。而且~/.profile
只会调用~/.bashrc
如果运行 bash。
从~/.profile
:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
当你登录 Gnome/GDM 时,你不是使用 Bash,因为 Gilles 也指出, /etc/gdm/Xsession
它使用了指令#! /bin/sh
,在 Ubuntu 中,它是指向短跑,而不是 bash。
因此整个 Gnome 登录过程不会调用 bash。这就是为什么不会自动调用 /etc/profile、~/.bash_login、~/.bash_profile 等文件的原因。这就是为什么/etc/profile
必须~/.profile
“手动”、明确地由 提供的原因/etc/gdm/Xsession
。他们在采购之前都会测试 Bash~/.bashrc
/etc/profile 中(以及 ~/.bashrc 中)对“是否为交互式 shell”的测试可能存在缺陷,但 bash 测试有效,并返回错误的登录时。这就是为什么你的日志文件只有一行...那是来自~/.profile
当你打开一个终端时,它是一个 bash 终端。Bash 本身~/.bashrc
直接调用,而~/.profile
不是执行。
我希望现在一切都已经明朗了。
最后但并非最不重要的:不要从 ~/.bashrc 中获取 ~/.profile,如上一个答案所建议的那样。这将导致循环引用(两个文件互相引用),从技术上和概念上来说都是错误的。如果曾经使用 bash 进行登录(可能是文本模式、修复控制台?),则可能会导致问题
答案4
您是否在 .bashrc 中获取 .profile?如果没有,Bash 将不会读取它。您应该有类似这样的内容,最好将其放在 .bashrc 的顶部:
[ -r ${HOME}/.profile ] && . ${HOME}/.profile
这将确保 .profile 存在且可读,如果是,则处理它。