8

我在理解 linux 中的行为时遇到了一个简单的问题。简而言之,在 Linux 上,如果我从“桌面快捷方式”调用我的 sh 脚本,则该脚本无法看到最新的环境变量(在 bashrc 中设置)。所以我想知道这个shell脚本位于什么范围内?

要创建测试用例并重现:

  1. 创建一个简单的 shell 脚本 'testme.sh' :

    !/bin/sh
    echo "嗨,这是一个检查环境变量的测试脚本";
    回声“TESTVAR = $TESTVAR”;
    读入
    回声“完成”;
    
  2. 为上面的脚本创建一个桌面快捷方式。

     
    cd ~/桌面
    vi mytest-desktop.desktop
    
    
    //mytest-desktop.desktop 的内容是:
    [桌面入口]
    版本=1.0
    类型=应用
    名称=TestAbhishek
    执行=/home/abhishek/test/hello.sh
    终端=真
    
  3. 现在更新您的 .bashrc 文件以设置变量
   导出 TESTVAR=test_this_variable
   
  1. 打开一个全新的终端并使用它的完整路径执行脚本,如'~/testme.sh' //这可以从.bashrc文件中看到变量'TESTVAR'的值。

  2. 现在,只需双击并执行桌面快捷方式。//这应该打开一个终端并将“TESTVAR”的值打印为空白。//所以我的问题是,这个快捷方式打开的终端的父级是谁?

我在 RHL 上试过这个。我正在寻找这个问题的解决方案或 aw/a,希望有人能尽快提供帮助。

谢谢,阿布舍克。

4

1 回答 1

11

请参阅 bash 手册页的INVOCATION部分。这是摘录

当 bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。当 shell 启动时,可以使用 --noprofile 选项来禁止这种行为。

当登录 shell 退出时,bash 从文件 ~/.bash_logout(如果存在)读取并执行命令。

当一个不是登录 shell 的交互式 shell 启动时,bash 会从 ~/.bashrc 读取并执行命令,如果该文件存在的话。这可以通过使用 --norc 选项来禁止。--rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 读取和执行命令。

长话短说,如果您希望非交互式 shell 设置某些 ENV 变量,则将它们放入~/.bash_profile而不是~/.bashrc

于 2010-12-18T08:41:45.290 回答