AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 13077
In Process
Dor
Dor
Asked: 2010-11-14 13:03:16 +0800 CST2010-11-14 13:03:16 +0800 CST 2010-11-14 13:03:16 +0800 CST

~/.profile 是由 bash 提供的吗?

  • 772

我正在尝试创建一个全局计数器变量以查看执行了多少次~/.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"
  • 我的/etc/gdm/Xsession
  • 我的~/.bashrc
  • 我的~/.profile
bash
  • 5 5 个回答
  • 2654 Views

5 个回答

  • Voted
  1. Ryan C. Thompson
    2010-11-14T13:59:46+08:002010-11-14T13:59:46+08:00

    从您对我原始答案的评论来看,您的真正问题似乎是“~/.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。

    • 6
  2. Gilles 'SO- stop being evil'
    2010-11-15T03:59:27+08:002010-11-15T03:59:27+08:00

    首先,如果您想查看 shell 脚本中发生的事情,请将set -x其放在顶部(#!如果有的话,就在该行之后)。这将打印标准错误的执行跟踪。这里应该将 shell 的标准错误重定向到~/.xsession-errors.

    您的问题中有一个矛盾:您说您的目标是“找出用户登录时 ~/.profile 执行了多少次”,然后您继续使用.bashrc. 仅仅export PROFILE_EXEC_TIMES; let "PROFILE_EXEC_TIMES += 1"输入你的.profile确实计算了它被采购的次数,结果为 1 也就不足为奇了(你只登录一次)。

    您的.profilesources ,在登录时使用.bashrc它很奇怪,并且是 bash 交互时的配置文件。也许您这样做是为了解决 bash 中的一个设计错误,即它不会在既是登录 shell 又是交互的 shell 中读取;我更喜欢同时拥有and (如果 shell 是交互式的)。.profile.bashrc.bashrc.bash_profile.profile.bashrc

    请注意,如果外壳不是 bash ,请.profile注意不要来源。.bashrc这解释了为什么.bashrc登录时不读取:/etc/gdm/Xsessionis executed by /bin/sh,在 Ubuntu 10.04 上是dash,而不是 bash 。

    在 的顶部附近.bashrc,您有:“如果不以交互方式运行,则不执行任何操作”评论该行[ -z "$PS1" ] && return。实际上,那条线不会这样做。PS1在非交互式 shell 中设置是相当常见的(例如,它由 设置/etc/profile)。交互式 bash 的可靠测试是[[ $- = *i* ]].

    您可能还对.bashrc 和 .bash_profile 之间的区别感兴趣。

    • 2
  3. MestreLion
    2011-02-19T15:55:33+08:002011-02-19T15:55:33+08:00

    @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:

    # 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 中它是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 登录可能会导致问题(可能是文本模式,修复控制台?)

    • 2
  4. Grumbel
    2010-11-14T14:57:59+08:002010-11-14T14:57:59+08:00

    ~/.profile仅对登录 shell ( bash --login) 执行,而不是所有 shell,这就是~/.bashrc目的。所以 1 的计数应该是正确的,因为~/.profile在您登录时执行一次。

    如果您不信任环境变量计数器,只需编写一个具有唯一文件名(类似于$(uuidgen))的文件来跟踪~/.profile执行情况。

    • 0
  5. jgoguen
    2010-11-14T18:17:29+08:002010-11-14T18:17:29+08:00

    您是否在 .bashrc 中采购 .profile?如果没有,Bash 将不会读取它。你应该有这样的东西,最好放在 .bashrc 的顶部:

    [ -r ${HOME}/.profile ] && . ${HOME}/.profile
    

    这将确保 .profile 既存在又可读,如果是,则处理它。

    • 0

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve