在 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 来编写一些脚本。该fish
shell 并非 100% 兼容bash
,这似乎是导致问题的原因。当您将登录 shell 更改为 以外的其他 shell 时,这是一个常见问题bash
。例如,请参阅此报告https://youtrack.jetbrains.com/issue/CPP-2919用户将他们的 shell 更改为/bin/tcsh
。
您需要向 Ubuntu 提交错误报告,以便有人调查并修复内部脚本fish
。如果您真的喜欢fish
,这就是您需要做的。;-)