在函数中仅设置一次 Fish 环境变量

Setting Fish Environment Variable Only Once in Function

我正在尝试使用鱼作为我的 shell。当我使用 LightDM 登录时,我想启动某些 Xsession 应用程序,但仅当 shell 在一开始由 LightDM 调用时。

我已经在 ~/.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 中启动一个新终端也是如此。

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

even when I start a new terminal within gnome-term.

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

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

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

  • 使用通用变量 - 这些变量永久存储并为机器上的所有鱼会话共享。这里的问题是使它无效 - 一旦你 logout/reboot,你需要再次取消设置变量,但如果你的机器崩溃,那不会发生

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

这是我在 ~/.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 作为我的窗口环境。