我有一个简单的问题来理解linux中的行为。简而言之,在Linux上,如果我从“桌面快捷方式”调用我的sh脚本,则脚本无法看到最新的环境变量(在bashrc中设置)。所以我想知道这个shell脚本在什么范围内?
创建测试用例并重现:
创建一个简单的shell脚本'testme.sh':
!/bin/sh echo "Hi This is a test script checking the env var"; echo "TESTVAR = $TESTVAR"; read in echo "Done";
为上面的脚本创建桌面快捷方式。
cd ~/Desktop vi mytest-desktop.desktop //Contents for mytest-desktop.desktop are : [Desktop Entry] Version=1.0 Type=Application Name=TestAbhishek Exec=/home/abhishek/test/hello.sh Terminal=true
export TESTVAR=test_this_variable
打开一个全新的终端并使用它的完整路径执行脚本,如'〜/ testme.sh'//这可以从.bashrc文件中看到变量'TESTVAR'的值。
< / LI>现在,只需双击并执行桌面快捷方式即可。 //这应该打开一个终端并将'TESTVAR'的值打印为空白。 //所以我的问题是,谁是这个快捷方式打开的终端的父级?
我在RHL上试过这个。 我正在为这个问题寻找解决方案或w / a,希望有人能尽快帮助。
谢谢, 阿布舍克巴克。
答案 0 :(得分:11)
请参阅bash联机帮助页的 INVOCATION 部分。这是一段摘录
当bash作为交互式调用时 登录shell,或作为非交互式 shell使用--login选项,它 首先读取并执行命令 从文件/ etc / profile,如果那样 文件已存在。看完那个文件后 它寻找〜/ .bash_profile, 〜/ .bash_login和〜/ .profile,在那里 命令,读取和执行命令 从第一个存在和是 可读。 --noprofile选项可以 在shell启动时使用 抑制这种行为。
当登录shell退出时,bash读取 并从文件中执行命令 〜/ .bash_logout,如果它存在。
当交互式shell不是 一个登录shell启动,bash读取 并执行来自〜/ .bashrc的命令, 如果该文件存在。这可能是 使用--norc选项禁止。 --rcfile文件选项将强制执行 bash读取和执行命令 从文件而不是〜/ .bashrc。
长话短说,如果您希望非交互式shell设置某些ENV变量,则将它们放入~/.bash_profile
而不是~/.bashrc