~/.profile 是否由 bash 提供?

~/.profile 是否由 bash 提供?

我正在尝试创建一个全局计数器变量来查看执行了多少次~/.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 存在且可读,如果是,则处理它。

相关内容