如何使用 chsh 更改 Linux 上的默认 Shell

Bash 不是唯一的 Linux shell。尝试其他 shell 很容易,例如非常流行的 Zsh。找到喜欢的 shell 后,使用 chsh
命令将其设为默认 shell。我们会告诉你怎么做。
为什么外壳很重要
外壳位于您和操作系统之间。它在终端窗口内提供环境,允许您键入命令和运行程序。 shell 检查您的输入并弄清楚您想要什么。如果它可以自己执行您的命令,它就会这样做。如果它需要外部帮助,它会搜索路径并找到可以执行您请求的任何程序。
Linux 上有许多不同的 shell。它们都允许您执行相同的核心任务:浏览文件系统、处理文件、启动程序和运行脚本。然而,他们每个人都以自己的方式执行这些任务,并且有自己的特殊功能和特质。
外壳往往是由希望事物以特定方式运行的人设计的。如果您的想法与该设计师的想法一致,那么该外壳可能很适合您。另外,在 Linux 上尝试新的 shell 很容易。
在大多数 Linux 发行版中,包括 Ubuntu,默认 shell 是 bash
。它做得很好并且非常有能力。但是,另一个 shell 可能会提供一种节省时间的差异,这会对您的工作流程产生重大影响。如果你不看,你永远不会知道!
一桶贝壳
我们之前介绍过不同的 Linux shell,但这里是对最常见的快速介绍:
- bash:Bourne again shell 是许多发行版中的默认设置。
- rbash:这个受限的
bash
shell 为在其中运行的人或脚本提供最少的功能。 - ash:Almquist shell 是 bash 的轻量级版本。
- dash: Debian Alquist Shell 是 Ubuntu 中的默认 shell 脚本。
bash
是默认的登录和交互式 shell,而dash
用于运行系统进程,因为它比bash
轻得多。 - zsh:Z shell 是
bash
shell 系列的现代版本。它提供了巧妙的改进,例如命令拼写检查和建议的更正。 - fish:这个友好的交互式 shell 是从头开始编写的,并非派生自任何其他 shell 系列。它旨在对用户友好。除了众多其他优势外,fish 还可以根据您的历史记录和当前文件夹的内容提供命令建议,类似于预测文本。
- ksh:KornShell 提供了一种特别强大的脚本语言。
列出已安装的外壳
要查看您的计算机上安装了哪些 shell,请使用此命令。它只是列出了 /etc/shells
文件的内容:
cat /etc/shells

我们提到了 bash
、dash
和 rbash
,但什么是 sh
? <代码>
sh
是 Thompson shell,由贝尔实验室的 Ken Thompson 于 1971 年编写而成。它不再维护,早已被现代 shell 所取代。包含它纯粹是为了保持与仍然具有以下第一行的旧脚本的兼容性:
#!/bin/sh
这指示系统使用 sh
shell 来执行脚本。你的机器上真的有那个古老的 shell 吗?它是否被用来运行你的脚本? which
命令将告诉我们当您键入命令时实际运行的程序。
让我们看看当您键入 sh
时会运行什么:
which sh
这似乎找到了一个二进制文件。但是,如果我们深入研究,我们会发现它是一个符号链接,实际上指向 dash
,这是用于执行脚本的轻量级外壳:
ls -l /bin/sh

这是为希望在现代系统上找到 sh
的脚本提供安全网的简洁、轻量级方法。
安装另一个外壳
让我们安装 fish
shell 并将其设置为 dave
的默认值。在 Ubuntu 上,我们输入以下命令:
sudo apt-get install fish

在 Manjaro 上,使用 pacman
:
sudo pacman -Sy fish

在 Fedora 上,键入以下内容:
sudo dnf install fish

安装完成后,您可以再次检查已安装的 shell:
cat /etc/shells

我们的新 shell 显示为 /usr/bin/fish
。记下这条路径——您很快就会用到它。
$SHELL 环境变量
$SHELL
环境变量保存当前 shell 的名称。我们可以使用 echo
检查它设置为哪个:
echo $SHELL
让我们启动 fish
shell:
fish
现在,让我们再次检查 $SHELL
环境变量的内容:
echo $SHELL

我们第一次使用 echo $SHELL
时,我们在 bash
shell 中。环境变量包含 bash
可执行文件的路径 /bin/bash
。
当我们启动 fish
shell 时,我们会收到一条友好的欢迎消息,并且命令提示符会发生变化。可能令人惊讶的是,$SHELL
环境仍然保留着 bash
可执行文件的路径 /bin/bash
。没关系——这很正常。
当您启动一个新的 shell(或任何其他程序)时,它会继承父 shell 的环境。因此,fish
shell 继承了 bash
shell 的全局和导出环境变量。因为 $SHELL
环境变量中的值没有改变,所以它在 fish
shell 中的值与在 bash
中的值相同> 外壳。
我们像其他程序一样运行 fish
。我们还可以使用 exit
退出 fish
shell。它像任何其他程序一样关闭,我们返回到 bash
shell。
这非常适合尝试新的 shell,看看它们能做什么,以及你是否与它们相处融洽。您可以在跳转之前进行探索,并采用一个作为您的首选 shell。
如果您决定将 fish
(或任何其他 shell)设为您的默认 shell,则需要使用 chsh
命令。
chsh 命令
chsh
命令允许您更改默认 shell。诀窍是意识到它允许您更改默认登录和默认交互式 shell。您可能想要更改一个或另一个,或同时更改两者。
每当您登录以获取命令提示符时,您都使用配置为登录 shell 的 shell。当您已经登录并打开终端窗口时,您将使用配置为交互式 shell 的 shell。这些可以是相同或不同的外壳。
要设置登录 shell,请使用不带参数的 chsh
:
chsh

系统会提示您输入密码。然后,您必须键入新 shell 的路径并按 Enter。
如果我们从另一台计算机远程连接到这台测试计算机,我们将在登录后发现自己处于 fish
shell 中。

要更改您的交互式 shell,请使用带有 -s
(shell)选项的 chsh
。在命令行上将路径传递到新 shell:
chsh -s /usr/bin/fish

系统会提示您输入密码并返回到当前 shell 的命令提示符。您需要注销并重新登录才能使更改生效。当您这样做时,您会看到问候语和 fish
shell 命令提示符。
$SHELL
环境变量现在包含新默认 shell 的路径:
echo $SHELL

更改另一个用户帐户的 Shell
如果你有 root 权限并且可以使用 sudo
,你可以更改其他用户帐户的 shell。命令与之前相同,只是在命令行中添加了那个人的用户名:
sudo chsh -s /usr/bin/fish mary

当 mary
下次登录时,她会在打开终端窗口时看到新的 shell。

每个人都有一个最喜欢的
只要您对自己选择的 shell 感到满意,并且它适合您,那就太好了!请记住,它必须能够运行常见的脚本,例如安装例程。对于这里提到的 shell,这应该不是问题。
当然,您也可以下载并安装一个新的shell,在不对您的计算机进行任何配置更改的情况下进行试驾。当您准备喜结良缘时,chsh
将为您举行仪式。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts