总结

总结

在 Ubuntu 18.04 上,我通过以下方式将 shell 更改为 fish

chsh -s `which fish`

我已经安装了 Maillspring 和 Visual Studio Code snap 应用程序,它们安装得很好,最初可以从仪表盘启动,但在登录并重新退出后,它们都不再出现在仪表盘上。

在软件商店中搜索它们显示已安装,我可以从那里启动它们。

为什么默认 shell 对此很重要?

答案1

您问题中原来的命令chsh -s which bash就像您说的那样是拼写错误,这导致您的问题非常混乱。即使它已经用 ` 符号正确形成,如下所示。

在此处输入图片描述 它会将 shell 更改为bash(默认)。要将 shell 更改为fish使用

在此处输入图片描述 或者直接使用命令 chsh并输入要使用的 shell 的路径。如下所示:

me@zippy-64bit:~$ chsh
Password: 
Changing the login shell for me
Enter the new value, or press ENTER for the default
    Login Shell [/bin/bash]: 

有关 fish shell 的更多信息,请参阅这。

编辑:关于 snap 包:默认 shell 重要吗?答案是可能,因为它取决于程序员所做的假设和采用的方法。请参阅上一个链接中 bash 和 fish 处理事物的方式的差异。例如,fish 没有隐式子 shell,这可能会对期望与 bash 类似行为的程序员在变量赋值时产生令人惊讶的副作用。问题中有一个很好的例子,说明了对隐式子 shell 的期望这里。

为什么?为了澄清这一点,fish 和其他更常见的 shell(如 bash)对继承概念的处理似乎有所不同。我的理解是,这可能会导致管道、循环和函数(所有这些都是常用的编程策略)出现意外行为。

程序员可能还依赖shell 内置命令这也可能不存在于鱼类中或者可能以意想不到的方式实现。

资料来源:

答案2

看起来 Ubuntu 使用默认 shell 调用 snap 应用程序,并且它似乎假定该 shell 是 bash(或者与 bash 兼容,如 zsh)。

我遇到了同样的问题(在 Ubuntu 18.10 上):之后chsh -s `which fish`,Gnome Shell 不再找到快照应用程序,即使添加到之后也是/snap/bin如此$PATH

我通过将默认 shell 设置为 Bash 来解决了这个问题,并改变了我的终端应用程序调用的(因为我主要通过我的终端仿真器使用我的 shell):

  • 打开终端
  • 优先,然后点击你的个人资料命令选项卡,勾选“运行自定义命令而不是我的 shell”然后在自定义命令fish
  • 对每个配置文件都执行此操作

在此处输入图片描述

此后,启动 Gnome-Terminal(从 Gnome Shell 或使用Ctrl+ Alt+ T)将启动 Fish shell,但系统 shell 仍为 Bash,因此不会中断。

然而,这意味着生成面向用户的 shell 的其他应用程序(例如 Visual Studio Code)可能也需要定制才能使用 Fish 而不是 Bash。

答案3

底部有一个 TL;DR。

为了使 gnome-shell 能够启动 Snaps,它需要两样东西(括号中的值在我的 Fedora 29 桌面上,它有同样的问题):

  • 包含 Snap 的路径 ( /var/lib/snapd/snap/bin)
  • XDG_DATA_DIRS 到 Snap Desktop 文件(/var/lib/snapd/desktop

这些变量是/etc/profile.d/snapd.sh通过/etc/profile常规 bash 启动配置的。

当你切换到鱼时,整个/etc/profile启动都会被跳过。

由于大多数发行版都假定使用 bash 并将配置脚本安装到 中/etc/profile.d,因此根本chsh -s /bin/fish不会使用它们。gnome-shell 找不到 Snaps 就是这样一种症状。

到目前为止,我能想到的最佳解决方案是仅使用 fish 作为交互式 shell,而让 bash 来做其他的事情。

总结

将用户默认 shell 保留为 bash:

chsh -s /bin/bash

其中~/.bashrc包含以下内容:

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

if [ -z "$BASH_EXECUTION_STRING" ]; then
    exec /bin/fish
fi

对于这种bash --login情况(通过 X11/Wayland 调用),删除~/.profile并添加.bash_profile(使其特定于 bash):

# we want to run fish most of the time, but this is invoked by bash --login
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

答案4

您安装的 snap 包可以在 /snap/bin/ 中找到,您需要将该目录放在您的 $PATH 中。

Ubuntu 会自动将 /snap/bin 添加到您的 $PATH。它发生在 /etc/profile.d/apps-bin-path.sh 中,当您获得登录 shell 时会运行它。

我检查过,并且fish还添加到了/snap/bin$PATH 中,所以通常应该没问题。

你能向我们展示一下命令的输出吗

echo $PATH

如果输出有/snap/bin,那么恭喜你发现了 Ubuntu 中的一个错误,你可以在 Launchpad 上为其提交报告。

添加:Ubuntu 内部可能使用 $SHELL 来编写一些脚本。该fishshell 并非 100% 兼容bash,这似乎是导致问题的原因。当您将登录 shell 更改为 以外的其他 shell 时,这是一个常见问题bash。例如,请参阅此报告https://youtrack.jetbrains.com/issue/CPP-2919用户将他们的 shell 更改为/bin/tcsh

您需要向 Ubuntu 提交错误报告,以便有人调查并修复内部脚本fish。如果您真的喜欢fish,这就是您需要做的。;-)

相关内容