从桌面快捷方式调用 shell 脚本时无法读取 .bashrc

发布于 2024-10-07 22:00:48 字数 849 浏览 7 评论 0原文

我在理解 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 exec=/home/abhishek/test/hello.sh 终端=真
  3. 现在更新您的 .bashrc 文件以设置变量
   export TESTVAR=test_this_variable
   
  1. 打开一个全新的终端并使用其完整路径(如“~/testme.sh”)执行脚本 //这可以从 .bashrc 中看到变量“TESTVAR”的值 打开一个全新的终端并

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

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

谢谢, 阿布舍克。

I have a simple problem understanding a behavior in linux. In short, on linux if i invoke my sh script from a 'Desktop Shortcut' then the script cannot see the latest environment variables (set in bashrc). So i was wondering that in what scope is this shell script located ?

To create a testcase and reproduce:

  1. Create a simple shell script 'testme.sh' :

    !/bin/sh
    echo "Hi This is a test script checking the env var";
    echo "TESTVAR = $TESTVAR";
    read in
    echo "Done";
    
  2. create a desktop shortcut for the script above.

     
    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
    
  3. Now update your .bashrc file to set the variable
   export TESTVAR=test_this_variable
   
  1. Open a brand new terminal and execute the script using it's complete path like '~/testme.sh' //This can see the value for variable 'TESTVAR' from the .bashrc file.

  2. Now, simply double click and execute the Desktop shortcut.
    //This should open a terminal and print out value for 'TESTVAR' as blank.
    //So my question is, who is the parent for the terminal opened by this shortcut?

I've tried this on RHL.
Im looking for a solution or a w/a for this problem, hope someone can help soon.

Thanks,
Abhishek.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

智商已欠费 2024-10-14 22:00:48

请参阅 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

See the INVOCATION section of the bash manpage. Here is an excerpt

When bash is invoked as an interactive
login shell, or as a non-interactive
shell with the --login option, it
first reads and executes commands
from the file /etc/profile, if that
file exists. After reading that file,
it looks for ~/.bash_profile,
~/.bash_login, and ~/.profile, in that
order, and reads and executes commands
from the first one that exists and is
readable. The --noprofile option may
be used when the shell is started to
inhibit this behavior.

When a login shell exits, bash reads
and executes commands from the file
~/.bash_logout, if it exists.

When an interactive shell that is not
a login shell is started, bash reads
and executes commands from ~/.bashrc,
if that file exists.
This may be
inhibited by using the --norc option.
The --rcfile file option will force
bash to read and execute commands
from file instead of ~/.bashrc.

Long story short, if you want non-interactive shell's to have certain ENV vars set, then put them in ~/.bash_profile instead of ~/.bashrc

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文