前言
今天在使用linux的时候,使用上下键想翻出历史命令时,却出现[[A[[A[[A[[B^[[B这种东东,而tab键补全命令的功能也无法使用。最终发现是由于当前用户使用的shell是/bin/sh的原因。
解决方法
运行以下命令,将默认 shell 设置为 /bin/bash:
echo $SHELL //查看当前使用的是那个版本的shellsudo chsh -s /bin/bash 当前用户名 //将旧版的sh程序设置成新版的bash程序,设置后重新登录终端
SHELL 环境变量的变化需要在重新登录后生效。请执行以下步骤:
- 退出当前会话:
exit
- 重新登录到系统。
- 再次检查:
echo $SHELL

bash和sh的区别
bash 和 sh 都是 UNIX 系统中的 shell 程序,但它们有一些显著的区别。以下是详细对比:
基本概念
**sh**** (Bourne Shell)**- 原始 shell,1979 年由 Stephen Bourne 开发。
- 是 UNIX 和类 UNIX 系统上的标准 shell,功能简单,脚本兼容性强。
- 许多操作系统使用
/bin/sh作为默认 shell。
**bash**** (Bourne Again Shell)**- 是 GNU 项目开发的增强版 shell,1989 年由 Brian Fox 发布。
- 基于
sh,向后兼容,同时增加了许多新功能,比如命令历史、数组支持等。 - 是 Linux 系统上的默认 shell,大多数 Linux 发行版都使用
/bin/bash。
功能对比
| 特性 | sh | bash |
|---|---|---|
| 历史功能 | 不支持命令历史 | 支持,使用 ↑和 ↓导航历史记录 |
| 命令补全 | 不支持 | 支持,按 Tab键补全文件和命令 |
| 数组支持 | 不支持 | 支持一维数组 |
| 整数运算 | 使用外部命令 (expr) | 内建整数运算 ($(( ))) |
| 条件判断语法 | 简单支持 (test) | 支持更高级的条件判断 |
| 脚本扩展功能 | 基础脚本支持 | 支持函数、数组、字符串操作等 |
| 错误调试 | 功能有限 | 支持 set -x和调试选项 |
兼容性
sh是许多系统脚本的标准,具有高度兼容性,尤其适用于 POSIX 标准环境。bash包含许多扩展特性,但部分功能在 POSIX 不兼容的环境中可能无法使用。
使用场景
**sh**- 使用脚本需要在不同平台上运行时(高兼容性)。
- 编写简单、可靠的脚本,如启动脚本或基本任务。
**bash**- 编写复杂的自动化脚本,需用到高级功能(如数组和字符串操作)。
- 在 Linux 环境中开发,且不考虑跨平台兼容性。
快速识别当前 shell
执行以下命令查看当前使用的 shell:
echo $SHELL
如果想查看正在运行的 shell 程序:
ps -p $$
总结
**sh**:轻量、兼容性强,适合简单任务。**bash**:功能强大,扩展性高,是现代 shell 的首选工具。
多数情况下,推荐使用bash,因为它向后兼容sh,并且提供了更多方便的功能。