安卓源码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)。


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

相关推荐
拭心11 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
带电的小王14 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡14 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道14 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库15 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道16 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe16 小时前
Android Hook - 动态加载so库
android
居居飒17 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He20 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗20 小时前
Android笔试面试题AI答之Android基础(1)
android