安卓源码source报错引发的shell类型知识

目录

  • 前言
  • 一、source报错日志
  • 二、解决方案
    • [2.1 检查当前 shell](#2.1 检查当前 shell)
    • [2.2 切换到 bash 或 zsh](#2.2 切换到 bash 或 zsh)
    • [2.3 重新运行脚本](#2.3 重新运行脚本)
    • [2.4 修改默认shell](#2.4 修改默认shell)
  • 三、shell类型知识
    • [3.1 什么是shell](#3.1 什么是shell)
    • [3.2 Linux 中不同类型的 shell](#3.2 Linux 中不同类型的 shell)
      • [3.2.1 Bourne Shell (sh)](#3.2.1 Bourne Shell (sh))
      • [3.2.2 GNU Bourne-Again Shell (bash)​](#3.2.2 GNU Bourne-Again Shell (bash))
      • [3.2.3. C Shell (csh)​](#3.2.3. C Shell (csh))
      • [3.2.4 Korn Shell (ksh)​](#3.2.4 Korn Shell (ksh))
      • [3.2.5 Z Shell (zsh)​](#3.2.5 Z Shell (zsh))

前言

新公司刚入职不久,在新项目中辛苦下载完安卓源码后,source后竟然报错!一起来看下整个过程吧,啊哈哈哈。

一、source报错日志

source build/envsetup.sh 之后报错如下:

c 复制代码
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类型

c 复制代码
echo $SHELL

而我的是

c 复制代码
/bin/sh

2.2 切换到 bash 或 zsh

因为我使用的是不支持的 shell,可以通过以下方式切换到 bash 或 zsh,现在linux默认使用bash

c 复制代码
# 切换到 bash  
bash  

# 或者切换到 zsh  
zsh

2.3 重新运行脚本

在支持的 shell 中重新运行命令:

c 复制代码
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:

c 复制代码
sudo vim /etc/passwd

找到你的用户名所在的那一行,格式如下:

c 复制代码
username:x:1000:1000:,,,:/home/username:/bin/sh  

将 /bin/sh 修改为 /bin/bash:

c 复制代码
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)。


好了,感谢你读到这里,希望本篇文章对你有所帮助!!!

相关推荐
五彩小白13 小时前
自回归和上下文
android
事圆则缓16 小时前
Android 多渠道打包实战:Product Flavors、签名、AAB 与发包校验
android
树下困觉眯18 小时前
View绘制流程学习--获取WindowManager的三种方式
android·系统架构·view design
vilya19 小时前
我怎么给手机 GUI Agent 做双通道感知:无障碍树为主,投屏像素兜底
android·人工智能
李子红了时20 小时前
阿狸舞台APP(安卓端手机EncFS解密+压缩包解压+视频播放)
android·音视频
事圆则缓20 小时前
Android 使用 Jenkins 实现 CI/CD,并用 SonarQube 建立质量门禁
android·ci/cd·jenkins
其实防守也摸鱼20 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化
恋猫de小郭20 小时前
Android CLI 支持 AI Agent 通过 Device Streaming 调试云真机
android·前端·flutter
素师良码2 天前
第5篇:显示驱动必备调试工具浅析
android
维克兜率天2 天前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化