我正在尝试创建一个全局计数器变量以查看执行了多少次~/.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"
从您对我原始答案的评论来看,您的真正问题似乎是“~/.profile 是否来自 GNOME?” 答案是肯定的。看看
/etc/gdm/Xsession
:原始答案
从 bash 的联机帮助页:
因此,您的主目录中可能有一个名为 .bash_profile 或 .bash_login 的文件。如果其中任何一个存在,bash 将使用它而不是 .profile。
首先,如果您想查看 shell 脚本中发生的事情,请将
set -x
其放在顶部(#!
如果有的话,就在该行之后)。这将打印标准错误的执行跟踪。这里应该将 shell 的标准错误重定向到~/.xsession-errors
.您的问题中有一个矛盾:您说您的目标是“找出用户登录时 ~/.profile 执行了多少次”,然后您继续使用
.bashrc
. 仅仅export PROFILE_EXEC_TIMES; let "PROFILE_EXEC_TIMES += 1"
输入你的.profile
确实计算了它被采购的次数,结果为 1 也就不足为奇了(你只登录一次)。您的
.profile
sources ,在登录时使用.bashrc
它很奇怪,并且是 bash 交互时的配置文件。也许您这样做是为了解决 bash 中的一个设计错误,即它不会在既是登录 shell 又是交互的 shell 中读取;我更喜欢同时拥有and (如果 shell 是交互式的)。.profile
.bashrc
.bashrc
.bash_profile
.profile
.bashrc
请注意,如果外壳不是 bash ,请
.profile
注意不要来源。.bashrc
这解释了为什么.bashrc
登录时不读取:/etc/gdm/Xsession
is executed by/bin/sh
,在 Ubuntu 10.04 上是dash,而不是 bash 。在 的顶部附近
.bashrc
,您有:“如果不以交互方式运行,则不执行任何操作”评论该行[ -z "$PS1" ] && return
。实际上,那条线不会这样做。PS1
在非交互式 shell 中设置是相当常见的(例如,它由 设置/etc/profile
)。交互式 bash 的可靠测试是[[ $- = *i* ]]
.您可能还对.bashrc 和 .bash_profile 之间的区别感兴趣。
@Dor:我还没有足够的声誉来写评论,但我可以回答你 2010 年 12 月 7 日 12:41 的最后一条评论,即:
“当我将代码附加到两个文件并登录 GNOME 时,文件 Xsession.log 中仍然只有一行(每次登录前 Xsession.log 文件都是空的)。为什么?应该至少有两行在后一种情况。”
不,因为当您登录 Gnome(使用 GDM)时,
~/.bashrc
不会执行,只有~/.profile
. 正如 Gilles 所解释的那样,Gnome 调用/etc/gdm/Xsession
,而后者又是 source~/.profile
。并且~/.profile
只有~/.bashrc
在运行 bash时才提供来源。来自
~/.profile
:当您登录 Gnome/GDM 时,您并没有使用 Bash,因为正如 Gilles 还指出的那样,
/etc/gdm/Xsession
它使用了指令#! /bin/sh
,在 Ubuntu 中它是dash的符号链接,而不是 bash。所以整个 Gnome 登录过程不会调用 bash。这就是为什么不会自动调用 /etc/profile、~/.bash_login、~/.bash_profile 等文件的原因。这就是为什么
/etc/profile
并且~/.profile
必须“手动”,明确来源/etc/gdm/Xsession
。他们都在采购之前测试了 Bash~/.bashrc
/etc/profile(以及 ~/.bashrc)中的“交互式 shell”测试可能存在缺陷,但 bash 测试有效,并且在登录时返回false。这就是您的日志文件只有 1 行的原因。 ..那是从
~/.profile
当您打开终端时,它是一个 bash 终端。Bash 本身
~/.bashrc
直接调用,~/.profile
不执行。我希望现在一切都清楚了。
最后但并非最不重要的一点:不要从 ~/.bashrc 获取 ~/.profile,如先前答案所建议的那样。这将导致循环引用(两个文件相互引用),并且在技术上和概念上都是错误的。如果曾经使用 bash 登录可能会导致问题(可能是文本模式,修复控制台?)
~/.profile
仅对登录 shell (bash --login
) 执行,而不是所有 shell,这就是~/.bashrc
目的。所以 1 的计数应该是正确的,因为~/.profile
在您登录时执行一次。如果您不信任环境变量计数器,只需编写一个具有唯一文件名(类似于
$(uuidgen)
)的文件来跟踪~/.profile
执行情况。您是否在 .bashrc 中采购 .profile?如果没有,Bash 将不会读取它。你应该有这样的东西,最好放在 .bashrc 的顶部:
这将确保 .profile 既存在又可读,如果是,则处理它。