ADB原理(第四篇:聊聊adb shell ps与adb shell ps有无双引号的区别)

前言

    对于经常使用adb的同学,不可避免的一定会这样用adb,比如我们想在手机里执行ps命令,于是在命令行中写下如下代码:

adb shell ps -ef

或者 

adb shell "ps -ef"

两种方式都可以使用,你喜欢用哪个呢?但是你知道双引号的作用吗?

双引号的作用

    从bash解释器的角度看:解释的力度不同,双引号内的有些特殊字符不再处理了

1、添加双引号的部分,单词分隔功能会失效(空白字符分隔:包括换行、空格、制表符)

由于单词分隔功能失效,"ps -ef" ,就是一个整体

2、双引号内仅支持命令替换、变量名替换、还有数字计算、还有转义字符,四种特殊字符

"$()"、"${}"、"$[]"、比如\n

    从adb命令的角度看:adb收到的参数数量不同


1、3个参数

adb shell ps -ef,这个时候adb接受到3个参数,分别是shell、ps、-ef,bash解释器通过空白字符,分隔单词,所以是3个参数

2、2个参数

adb shell "ps -ef",此时接受到的是2个参数,由于双引号,让单词分隔功能失效,所以只有shell、以及"ps -ef" ,着2个参数传递给adb命令了

重定向时,有无双引号的差别

adb shell ps -ef > ./hello.txt

或者

adb shell "ps -ef > /sdcard/hello.txt"

""具有单词分隔的功能,前面已经交代了,这次在说明一件事,ps命令根本就不知道自己的标准输出写到文件中了,它只是认为还写入到标准输出,至于重定向,那都是bash解释器作的事情

 1、重定向到本地主机的文件中

adb shell ps -ef > ./hello.txt

对于adb命令,它只收到3个参数,shell、ps、-ef,后面的 > ./hello.txt,由本地主机的bash解释器自行处理,它会本地主机,而不是手机中,创建一个hello.txt文件,用于插入adb返回的标准输出

2、重定向手机文件中

adb shell "ps -ef > /sdcard/hello.txt"

由于""具备单词分隔功能失效,以及仅只是4种特殊字符(上面提到过的),其他字符不再解释,这里的重定向符号>,bash解释器并不会再去解释

对于adb命令,adb收到了2个参数,shell、以及"ps -ef > /sdcard/hello.txt",所以ps命令的标准输出其实是写入到手机的/sdcard/hello.txt文件中,这是由android上的bash解释器来处理的,所以它自然会写入到手机的文件中

管道符,也有不同

adb shell ps -ef | grep camera

 或者

adb shell "ps -ef | grep camera" 

1、执行的是本地主机的grep

adb shell ps -ef | grep camera

bash解释器看到管道符,那么代表adb命令以及后面的参数就到管道符那里,所以adb收到了3个参数,分别是shell、ps、-ef。 而 | grep camera,则是由bash解释器来处理,并调用本地主机的grep来接受前一个adb命令的标准输出,再由grep向标准输出写入

2、执行的是手机上的grep命令

adb shell "ps -ef | grep camera"

""命令已经让"ps -ef | grep camera"成为一个整体,同时管道符号也不会再解释器,对于adb,它只收到了2个参数,分别是shell、"ps -ef | grep camera",当传入到手机中,调用的是手机上的grep命令

总结

1、熟悉双引号""作用,才能理解上面的情况,再强调一遍,双引号会让单词分隔功能失效(空白字符无效),仅支持命令替换、变量名替换、整数计算、转义字符,其他字符,bash解释器都不会再解释,比如 重定向 >,还有 管道 |

2、重定向、管道符都是bash解释器来处理的,对于命令本身,他们都不知道这些的存在,他们只会向标准输出写入、标准错误写入、至于重定向到文件、还是通过管道进入到其他命令的标准输入,他们都是一概不知道的

3、理解了这个,可以避免编写adb命令的一些坑,尤其是使用windows命令行的时候,毕竟windows默认终端上没有grep命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型(LLM)综述(三):大语言模型预训练的进展

A Survey of Large Language Models 前言4. PRE-TRAINING4.1数据收集4.1.1 数据源4.1.2 数据预处理4.1.3 预训练数据对LLM的影响 4.2 模型架构4.2.1 典型架构4.2.2 详细配置4.2.3 预训练任务4.2.4 解码策略4.2.5 总结和讨论 4.3 模型训练4.3.1 优化设置4.3.2 可扩展的训练技术 …

TypeScript之索引签名

1. 索引签名 在 TypeScript 中,索引签名是一种定义对象类型的方式,它允许我们使用字符串或数字作为索引来访问对象的属性。 索引签名最主要的作用就是允许我们动态地添加或访问对象的属性,通过使用索引签名,我们可以在编译时无法…

【Linux】线程同步

线程同步 线程仅仅互斥,是可以保证线程安全的。但是,这不合理!如果一个线程竞争到了锁,那么再它释放后它依然可以竞争个锁。因为CPU此时正在执行当前线程,所以该线程又可以继续竞争锁。 这样就会造成一个问题&#xf…

Python 继承和子类示例:从 Person 到 Student 的演示

继承允许我们定义一个类,该类继承另一个类的所有方法和属性。父类是被继承的类,也叫做基类。子类是从另一个类继承的类,也叫做派生类。 创建一个父类 任何类都可以成为父类,因此语法与创建任何其他类相同: 示例&…

简单介绍一下迁移学习

迁移学习是一种机器学习技术,旨在利用从一个任务或领域学习到的知识来改善另一个任务或领域的学习性能。在传统的机器学习方法中,通常假设训练数据和测试数据是从相同的分布中独立同分布采样的。然而,在现实世界中,这个假设并不总…

Golang Websocket框架:实时通信的新选择

前言 在现代应用程序中,实时通信已经成为了一种必需的特性。而Websocket是一种在客户端和服务器之间建立持久连接的协议,可以实现实时的双向通信。Golang作为一门高效且简洁的语言,也提供了一些优秀的Websocket框架,方便开发者构…

【计算机网络】从输入URL到页面都显示经历了什么??

文字总结 ① DNS 解析:当用户输入一个网址并按下回车键的时候,浏览器获得一个域名,而在实际通信过程中,我们需要的是一个 IP 地址,因此我们需要先把域名转换成相应 IP 地址。浏览器会首先从缓存中找是否存在域名&…

一文5000字从0到1使用Jmeter实现轻量级的接口自动化测试(图文并茂)

接口测试虽然作为版本的一环,但是也是有一套完整的体系,有接口的功能测试、性能测试、安全测试;同时,由于接口的特性,接口的自动化低成本高收益的,使用一些开源工具或一些轻量级的方法,在测试用…

uniapp进行条件编译的两种方法

在UniApp中,进行条件编译有两种方法:使用process.env全局变量和使用条件注释。 1.使用process.env全局变量:UniApp支持根据不同的环境变量来进行条件编译。可以通过在代码中使用process.env来判断当前环境并执行相应的逻辑。 if(process.env…

Tauri2 mobile development traps

时间点:2023/10/24。最近在倒腾移动端开发,不想学原生和 flutter,试了试 react-native,开发体验没有想象中的舒服,干脆直接上 tauri 2 吧,半年前就听说 tauri 2 支持移动端,到现在应该可堪小用。…

idea 插件 checkstyle 规则示例和说明

idea 安装插件 idea 配置插件 checkstyle.xml 示例和说明 <?xml version"1.0"?> <!DOCTYPE module PUBLIC"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN""https://checkstyle.org/dtds/configuration_1_3.dtd"><mod…

Are Large Language Models Really Robust to Word-Level Perturbations?

本文是LLM系列文章&#xff0c;针对《Are Large Language Models Really Robust to Word-Level Perturbations?》的翻译。 大型语言模型真的对单词级扰动具有鲁棒性吗&#xff1f; 摘要1 引言2 相关工作3 合理稳健性评价的奖励模型&#xff08;TREvaL&#xff09;4 LLM的词级…

I/O软件层次结构(用户层软件,设备独立性软件,设备驱动程序,中断处理程序,硬件)

文章目录 1.用户层软件2.设备独立性软件1.主要实现的功能2.逻辑设备表&#xff08;LUT&#xff09; 3.设备驱动程序4.中断处理程序2.中断处理程序的处理流程 4.硬件 1.用户层软件 用户层软件实现了与用户交互的接口&#xff0c;用户可直接使用该层提供的、与I/O操作相关的库函数…

ubuntu gcc版本降级 Reset gcc version from 11.3 to 11.2 on Ubuntu 22.04

aptitude 需要自己安装 sudo apt-get install aptitude # 安装# aptitude的一些常用的操作&#xff1a; sudo aptitude update # 更新软件源 sudo aptitude search 软件名称 # 查看软件 sudo aptitude install 软件名称 …

【Qt】绘图与绘图设备

文章目录 绘图设备QPainter绘图实例案例1案例2-高级设置案例3&#xff1a;利用画家画资源图片 点击按钮移动图片 QtPaintDevice实例Pixmap绘图设备QImage 绘图设备QPicture 绘图设备 QPainter绘图 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系…

Apifox创建团队 项目 接口 邀请成员步骤演示

我们打开Apifox 找到 个人空间 然后 点击新建团队 然后这里 我们输入名字 点击确定 我们的团队就出来了 然后 我们点击新建项目 然后肯定是 http 项目名称输入一下 然后 语言 我们中国肯定是中文的 然后点击确定 建好之后 我们就会进入自己的项目啦 然后 我们可以新建个接…

ThinkPHP8学习笔记

ThinkPHP8官方文档地址&#xff1a;ThinkPHP官方手册 一、composer换源 1、查看 composer 配置的命令composer config -g -l 2、禁用默认源镜像命令composer config -g secure-http false 3、修改为阿里云镜像源composer config -g repo.packagist composer https://mirror…

C51--单片机中断

51单片机是单线程模式&#xff0c;需要用到硬件中断。 一、中断系统 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理器CPU正在处理某件事的时候&#xff0c;外界发生了紧急事件请求&#xff0c;要求CPU暂停当前工作&#xff0c;转而去处理这个紧急…

程序员们平时都喜欢逛什么论坛呢?

网站不在多&#xff0c;好用就行&#xff1b;技术不求精&#xff0c;好摸鱼就行。是时候祭出我收藏夹里的这15个网站了&#xff01; 求职必备&#xff1a;牛客网 https://www.nowcoder.com/ 年少不知牛客好&#xff0c;等到要面试的时候才发现是神器。 你可以在牛客上搜索到一…

C#WPFPrism框架导航应用实例

本文实例演示C#WPFPrism框架导航应用实例。 一、导航实现步骤 首先创建WPF项目,修改App相关文件内容,以便使用prism。 承接上一个模块化的实例,在这个基础上更改增加导航功能。 1.1首先在ModuleA中添加ViewModels文件夹,添加ViewAViewModel.cs类 如果想上下文自动查找…