为什么使用 Fish shell 时 snap 包会消失?

为什么使用 Fish shell 时 snap 包会消失?

如果我全新安装 Ubuntu 17.10,通过 snap 安装一个软件包,并将我的 shell 更改为 fish,再次登录后,gnome-shell 的菜单和我的收藏夹列表中会缺少该软件包。

奇怪的是,这也只有在使用 Wayland 时才会发生。

什么原因可能导致此问题?我可以确认我的 shell 正常工作并且路径正常。我还可以通过 snap run 或它们的命令行版本确认这些应用程序运行良好,但好像缺少 *.desktop 文件。

答案1

如果不存在则创建~/.config/fish/config.fish,并添加以下两行

set PATH /var/lib/snapd/snap/bin $PATH
set XDG_DATA_DIRS /var/lib/snapd/desktop/:$XDG_DATA_DIRS

这会将快照应用程序放在您的路径上并使您的快捷方式图标可用。

答案2

问题:该问题与您的登录 shell 有关。

当为源时,变量XDG_DATA_DIRS被设置( )/etc/profile.d/etc/profile.d/apps-bin-path.sh

但是如果你使用 fish-shell(如你的情况)或 zsh,你就不会采购/etc/profile.d/,因此XDG_DATA_DIRS永远不会设置,并且找不到.desktop中的文件/var/lib/snapd/desktop。这不是错误,而是由于 fish 不兼容 POSIX 1003.1。这意味着这些 shell 不理解 bash 语法。

解决方法:

我能想到至少两种解决方法。

  1. 最简单的方法是将默认 shell 反转为 bash

    chsh -s /bin/bash
    

    然后添加行

    fish 
    

    在 的末尾~/.bashrc。这样你的登录 shell 将是 bash,而你的/etc/profile.d将被 sourced,但每次打开终端时您都会使用 fish。在终端上输入“exit”将跳转回 bash。

  2. 最棘手的方法是保留 fish 作为你的登录 shell,但强制/etc/profile.d使用 sourced。为此,您需要遵循以下步骤:

    1. 从你的 fish shell 安装 fisher 和 bass (使 Bash 实用程序可在 Fish shell 中使用)。

      curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher 
      
      # instruct fisher to download the bass package   
      fisher add edc/bass 
      
    2. 编辑您的~/.config/fish/config.fish(如果不存在则创建它)并/etc/profile.d使用 bass 提供每个文件。

      nano ~/.config/fish/config.fish
      

      (在另一个终端中ls获取/etc/profile.d directory文件列表。复制它们)

      将列表粘贴到你的纳米终端中,如下所示:

      bass source /etc/profile.d/apps-bin-path.sh 
      
      bass source /etc/profile.d/cedilla-portuguese.sh 
      
      bass source /etc/profile.d/vte-2.91.sh 
      
      bass source /etc/profile.d/bash_completion.sh 
      
      bass source /etc/profile.d/input-method-config.sh 
      
      bass source /etc/profile.d/xdg_dirs_desktop_session.sh 
      

      保存、关闭、关闭会话或重新启动,然后‘ta-da’。

    使用这个选项,你可以将 fish 保留为你的登录 shell,但你必须/etc/profile.d时不时地检查目录以确保没有你未获取的新文件。

答案3

除了建议的内容之外Esteban Vergara 的回答,我在~/.config/fish/config.fish文件中添加了以下几行:

for file in /etc/profile.d/*.sh
        bass source $file
end

profile.d这将避免出现他建议的定期检查文件夹的问题,因为它会在会话启动时递归加载该文件夹中的所有 sh 文件。

相关内容