【问题标题】:Setting Fish Environment Variable Only Once in Function在函数中只设置一次 Fish 环境变量
【发布时间】:2016-12-02 14:39:46
【问题描述】:

我正在尝试使用鱼作为我的外壳。当我使用 LightDM 登录时,我想启动某些 Xsession 应用程序,但前提是 LightDM 一开始就调用了 shell。

我在 ~/.config/fish/config.fish 中试过这个:

###################################################################
# Start xsession applications, but only once.
if test -z "$XSESSION_STARTED"
  set -xg XSESSION_STARTED 'f'
end

if test "$XSESSION_STARTED" = 'f'
  xsession-apps
end

函数 xsession-apps 然后在后台启动所有应用程序并在最后设置环境变量,如下所示:

set -xg XSESSION_STARTED "t"

但 XSESSION_STARTED 似乎没有设置为 't' 并导致每次调用 xsession-apps 函数,即使我在 gnome-term 中启动新终端也是如此。

我错过了什么。有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: shell environment-variables fish


    【解决方案1】:

    即使我在 gnome-term 中启动一个新终端。

    这是意料之中的。全局变量在特定的鱼中设置。如果您启动另一条鱼,它不会拥有它(除非您在该鱼内部启动它,因为变量已导出)。

    有几种方法可以解决这个问题:

    • 根本不要在 config.fish 中这样做 - 使用 DE 的自动启动机制或至少使用 ~/.xinitrc。这是最好和最干净的方法,并且独立于您的 shell。

    • 使用通用变量 - 这些变量永久存储并为机器上的所有鱼会话共享。这里的问题是使其无效 - 您需要在注销/重新启动后再次取消设置该变量,但如果您的机器崩溃,则不会发生这种情况

    • 在 tmpfs 上使用标志文件(即在 RAM 中) - 如果您的机器停止,无论什么原因,这将自动失效。不过,您需要为它设置一个 tmpfs。

    【讨论】:

    • @faho 没有强调的一点值得注意的是,环境变量(你从set -gx 获得的)只对由该 shell 启动的程序可见。当您打开一个新终端时,该程序由 LightDM 启动,它不知道 XSESSION_STARTED 环境变量,因为它是由子进程创建的。环境变量并非对系统上的每个进程都是全局可见的。这不是他们的工作方式。
    • 法霍,谢谢你的回答。如果我使用 bash 函数来启动 fish 函数,则将其放入 ~/.xsessionrc 中会起作用。我会把我的代码放在下面。
    【解决方案2】:

    这是我在 ~/.xsessionrc 中使用的代码:

    # Apps launched directly by X window managers don't have their environment set
    if [ $SHELL = "/usr/bin/fish" ]
    then
        /usr/bin/fish -c xsession-apps
    else
       source ~/src/dotfiles/keychain.sh
       source ~/src/dotfiles/shell/aliases
       source ~/src/dotfiles/shell/env
       source ~/src/dotfiles/xsession-apps
    
       eval "$(~/.rbenv/bin/rbenv init -)"
    fi
    

    它初始化fish或bash/zsh,这取决于我当时的心情。最近喜欢吃鱼。然后我定义了一个名为xsession-apps 的fish 函数来启动我想要在我的X 会话中启动的东西,例如dropbox、hplip、xmobar 等。我有一个与bash 脚本类似的设置,也称为xsession-apps,它得到如果我不使用鱼,则来源。

    顺便说一句,我使用 xmonad 作为我的窗口环境。

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多