目录
前言
新公司刚入职不久,在新项目中辛苦下载完安卓源码后,source后竟然报错!一起来看下整个过程吧,啊哈哈哈。
一、source报错日志
source build/envsetup.sh 之后报错如下:
source build/envsetup.sh
WARNING: Only bash and zsh are supported.
Use of other shell would lead to erroneous results.
including vendor/sprd/external/tools-build/vendorsetup.sh
including vendor/sprd/feature_configs/vendorsetup.sh
-sh: check_type: command not found
-sh: check_type: command not found
-sh: /home/xuejie/SC200L/tools/tradefederation/core/atest/atest_completion.sh: line 86: syntax error near unexpected token `<'
-sh: /home/xuejie/SC200L/tools/tradefederation/core/atest/atest_completion.sh: line 86: ` while read dev; do echo $dev | awk '{print $1}'; done < <(adb devices | egrep -v "^List|^$"||true)'
起初我并没有理会,继续后续的lunch、make,直到编译出错,又对比了其他同事的source,并未产生同样报错,我才进一步分析报错的内容。
WARNING: Only bash and zsh are supported. Use of other shell would lead to erroneous results.
警告:仅支持bash和zsh。使用其他shell 会导致错误的结果。
其实告诉我们已经很明确了,就是source 那条命令不支持当前的shell,运行不正常,会导致后面的错误结果。
二、解决方案
怎么解决呢?
2.1 检查当前 shell
使用如下命令可以查看当前shell类型
echo $SHELL
而我的是
/bin/sh
2.2 切换到 bash 或 zsh
因为我使用的是不支持的 shell,可以通过以下方式切换到 bash 或 zsh,现在linux默认使用bash
# 切换到 bash
bash
# 或者切换到 zsh
zsh
2.3 重新运行脚本
在支持的 shell 中重新运行命令:
source build/envsetup.sh
including vendor/sprd/external/tools-build/vendorsetup.sh
including vendor/sprd/feature_configs/vendorsetup.sh
all right,没毛病了
2.4 修改默认shell
值得注意的是上述切换到bash只能临时使用bash,shell窗口关闭后重启shell又回到了默认的sh。
将默认的 shell 从 /bin/sh 永久更改为 bash,还要按照以下步骤进行操作
打开/etc/passwd 文件。这个过程需要超级用户权限,操作时谨慎一点。
使用编辑器打开 /etc/passwd:
sudo vim /etc/passwd
找到你的用户名所在的那一行,格式如下:
username:x:1000:1000:,,,:/home/username:/bin/sh
将 /bin/sh 修改为 /bin/bash:
username:x:1000:1000:,,,:/home/username:/bin/bash
保存并退出编辑器。
此时重启shell,shell类型就默认是bash了
三、shell类型知识
问题是解决了,但是shell类型到底是个什么东西?什么sh ,bash,zsh等等,他们的区别和联系是什么?
3.1 什么是shell
每当用户登录系统或打开一个控制台窗口时,内核就会运行一个新的 shell 实例。内核是任何操作系统的核心,它负责控制管理和进程执行,并确保系统资源的正确利用。 Shell 是一个充当用户和内核之间接口的程序。它让用户可以向内核发出命令,并从内核那里得到回应。通过 shell,我们可以在内核上执行程序和工具。因此,shell 本质上是一个用来在我们的系统上执行其他程序的程序。 能够与内核互动的特性使得 shell 成为了一个强大的工具。如果没有与内核互动的能力,用户就不能访问他们机器的操作系统所提供的实用工具。
3.2 Linux 中不同类型的 shell
每种 shell 都有一些特性,使它们用于某种用途时比其他 shell 更有效率。看一下 Linux 中不同类型的 shell 以及它们的属性和特点。
3.2.1 Bourne Shell (sh)
Bourne shell 由 Steve Bourne 在 AT&T 贝尔实验室开发,被认为是第一个UNIX shell。它被表示为 sh。由于紧凑和操作速度快,Bourne shell 广受欢迎。 以上特性使得它成为 Solaris 操作系统的默认外壳。它也被用作所有 Solaris 系统管理脚本的默认外壳。然而,Bourne shell有一些明显的缺点:
- 它没有内置的处理逻辑和算术运算的功能。
- 另外,与Linux中大多数的 shell 不同,Bourne shell不能回忆以前使用过的命令。
- 它功能不全面, 无法提供适当的交互式使用。 Bourne shell的完整路径名称是/bin/sh和/sbin/sh。默认情况下,它对 root 用户使用 # 提示符,对非 root 用户使用 $ 提示符。
3.2.2 GNU Bourne-Again Shell (bash)
GNU Bourne-Again shell 更多被称为 Bash shell,它被设计成与Bourne shell兼容。Bash shell 融合了 Linux 中不同类型 shell 的有用功能,如 Korn shell 和 C shell。 与Bourne shell不同的是,它能够自动回忆以前使用过的命令,并可以使用方向键编辑它们。 GNU Bourne-Again shell的完整路径名称是/bin/bash。默认情况下,它对 root 用户使用的提示符是 bash-版本号#,对非 root 用户的提示符是 bash-版本号$。
3.2.3. C Shell (csh)
C shell 是由 Bill Joy 在加利福尼亚大学创建的。它被表示为 csh。开发 C shell 是把有用的编程功能容纳进去,如对算术运算的内置支持和类似于 C 语言的语法。 此外,它还包含了 Linux 中不同类型的 shell(如Bourne shell)中所缺少的历史命令。C shell 的另一个显著功能是“别名”。 C shell的完整路径名称是/bin/csh。默认情况下,它对 root 用户的提示符是 主机名#,对非 root 用户的提示符是 主机名$。
3.2.4 Korn Shell (ksh)
Korn shell 是由 David Korn 在 AT&T 贝尔实验室开发的,用于改进 Bourne shell。它被表示为 ksh。Korn shell 本质上是 Bourne shell 的一个超集。 除了支持 Bourne shell 所支持的一切外,Korn shell 还为用户提供了新的功能。它有着内置的对算术运算的支持,同时提供类似于 C shell 的交互功能。 Korn shell 运行为 Bourne shell 编写的脚本,同时提供类似于 C 语言的字符串、数组和函数运算。它还支持为 C shell 编写的脚本。此外,它比 Linux 中大多数不同类型的 shell(包括 C shell)要快。 Korn shell 的完整路径名称是/bin/ksh。默认情况下,它对 root 用户使用 # 提示符,对非 root 用户使用 $ 提示符。
3.2.5 Z Shell (zsh)
Z Shell 或 zsh 是 sh shell 的扩展,在自定义方面做了大量改进。如果你想要一个具有更多功能的现代 shell,zsh shell就是你要找的。 Z shell 有以下亮点:
- 根据给定的条件生成文件名
- 支持插件和主题
- 索引内置函数
- 自动补全命令
总结一下 Linux 中不同的 shell,
Shell | 完整路径名 | root 用户提示符 | 非 root 用户提示符 |
---|---|---|---|
Bourne shell (sh) | /bin/sh 和 /sbin/sh | # | $ |
GNU Bourne-Again shell (bash) | /bin/bash | bash-版本号# | bash-版本号$ |
C shell (csh) | /bin/csh | # | % |
Korn shell (ksh) | /bin/ksh | # | $ |
Z Shell (zsh) | /bin/zsh | <主机名># | <主机名>% |
在Linux中,最常用的Shell是 Bash(Bourne Again Shell)。
好了,感谢你读到这里,希望本篇文章对你有所帮助!!!