【LInux】基础开发工具的使用

2023-11-16

文章目录

一. Linux的应用市场 — yum

1. 什么是yum?

人们把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安
装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器.,相当于Linux的应用市场,主要应用在Fedora, RedHat,Centos等发行版上。

2. 为什么要有yum?

给开发者提供一个安全、高效的软件安装环境。

3. 如何使用yum?

3.1 前提条件

关于 yum 的所有操作必须保证主机(虚拟机)处于联网状态。就行我们在手机上下载软件,需要连WIFE或开流量一样。

我们可以通过ping指令来验证我们的机器是否处于联网状态,具体的操作就是ping + 网址,如果一直有刷新time = xxxms说明已经处于联网状态。
在这里插入图片描述

3.2 搜索软件

就好比我们在手机的应用市场里搜索我们想要下载的App一样
在这里插入图片描述
在Linux中,我们也可以通过yum list | grep | 软件包关键字这个指令来搜索yum里包含该关键字的软件包。

比如我们要下载一个软件叫 lrzsz ,可以在linux中可以代替ftp的上传和下载。
在这里插入图片描述
几点说明:

  • “x86_64” 后缀表示64位系统的安装包,选择包时要和系统匹配
  • “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6
  • 最后一列, os 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “App Store” 这样的概念。

3.3 安装软件

通过前面的搜索我们可以得到想要下载的软件包的名称,复制软件包的名称,然后我们可以输入yum install 软件包名称指令来完成软件的安装
在这里插入图片描述

最后出现 “complete” 字样, 说明安装完成。

几点说明:

  • 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成,安装后的软件所以用户都可以使用。
  • yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错。

3.4 卸载软件

直接输入指令yum remove 软件包名称,当然也需要 sudo 或者切到 root 账户下才能完成。
在这里插入图片描述

二. Linux的文本编辑器 — vim

1. 什么是vim?

vi(visual editor)编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows 系统下的notepad(记事本)编辑器。

vim(vi improved)是vi编辑器的加强版,它不仅兼容vi的所有指令,而且还有一些新的特性在里面,例如语法加亮、自动缩进等。

2. 为什么要学习vim?

  1. 很强大的编辑功能,不逊色于任何最新的文本编辑器。
  2. vi编辑器是所有Unix及Linux系统下标准的编辑器,所有的Unix Like系统都会内建vi文本编辑器,其他的文本编辑器则不一定会存在
  3. 一些软件的编辑接口会主动调用vi (例如 crontab, visudo, edquota 等命令)

3. 如何使用vim?

3.1 启用vim

指令:
vim 文件名,进入后默认光标是在上一次退出编辑时的位置

vim 文件名 + n,进入后光标位置在第n行

3.2 退出vim

命令模式下退出

在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则vim保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则vim直接退出, 返回到shell。

底行模式下退出

:w 保存但不退出

:q 退出但不保存

:wq 保存且退出

:!wq 强制保存且退出

3.3 简单配置vim

原生的vim界面是比较简陋的,不仅如此编程的体验也很不好,没有换行后自动缩进、tab距离太短、没有自动补齐等问题,这些都可以通过配置自己来解决。
在这里插入图片描述

配置文件的位置

  • 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件对所有用户都有效
  • 而在每个用户的主工作目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”,这个文件通常不存在,需要我们自己建立。注意这里的配置只针对当前用户有效

配置操作

下面我们简单讲解一下只针对当前用户有效的vim的配置方法

第一步:
在当前用户的主工作目录下创建".vimrc"这个文件,如果有的话就不用创建了。

终端操作:
$ cd ~ //回到主工作目录
$ touch .vimrc //创建文件

第二步:
进入 .vimrc 文件,写入我们需要的配置选项。常见配置选项比如下面几个:

  • 显示行号: set nu
  • 设置语法高亮: syntax on
  • 设置缩进的空格数为4: set shiftwidth=4

终端操作:
$ vim .vimrc //进入文件
在这里插入图片描述
保存并退出,再次进入这个文件我们发现确实配置成功了
在这里插入图片描述

3.4 vim常见的几种模式

主要介绍几种常见的模式:正常模式、插入模式、命令模式、视图模式

3.4.1 正常模式

正常模式是vim打开文件后默认进入的模式,无论在哪种模式下,按下Esc键就会进入正常模式。如果我们在使用其他各种模式时出现混乱,无脑Esc进入正常模式就行。
在这里插入图片描述

正常模式的作用

正常模式不能编辑文本。它一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一般的键/键组合会被当成功能键,而不会键入对应的字符。

在这个模式下,我们可能通过键盘在文本中跳来跳去,跳动的范围从小到大是字符、单词、行、句子、段落和屏幕。

正常模式下管理文本的常用快捷键

shift + $:定位到当前行的最后一个字符位置

shift + ^:定位到当前行的第一个字符的位置

gg:定位到代码第一行位置

shift + g:定位到代码最后一行的位置

u / ctrl+r:撤销 / 反撤销

yy / p:复制一行 / 粘贴一行

n+yy / n+p:复制n行 / 粘贴n行

dd / n+dd:删除一行 / 删除n行

shift + ~:从光标位置开始逐个字符地从左往右进行大小写切换

w / b:以“单词”为单位进行光标的跳转

ctrl + b:文本向上移动一页

ctrl + f:文本向下移动一页

ctrl + u:文本向上移动半页

ctrl + d:文本向下移动半页

3.4.2 插入模式

在正常模式下按下a、i、o 键,进入插入模式,插入模式里可以进行文字的输入,在该模式下按Esc键可以切换回正常模式。

当我们处于正常模式时,按下:

  • a :在光标的下一个位置进入插入模式
  • i :在光标当前位置进入插入模式
  • o :往下开辟一空行进入插入模式

在这里插入图片描述

插入模式的作用

插入模式中,击键时会写入相应的字符。

插入模式下快速编辑

插入模式没有快捷键,需要配合命令模式下的那些快捷键进行文本编辑,可以达到快速编辑的作用。

3.4.3 底行/命令模式

在正常模式下输入“:”进入命令模式
在命令模式中按Esc进入正常模式
在这里插入图片描述

命令模式的作用

在命令模式中可以执行一些输入并执行一些vim或插件提供的指令,就像在shell里一样。这些指令包括设置环境、文件操作、调用某个功能等等。

命令模式的下的常用快捷键

set mouse=a / mouse-=a:打开鼠标 / 关闭鼠标

set nu / nonu:设置行号 / 取消行号

w:保存

q:退出

wq:保存并退出

! + wq:强制保存并退出

vs + 文件名:多文件分屏编辑(补充:在正常模式下按ctrl + ww可以进行文件切换)

↑ / ↓:搜索历史命令

3.4.4 视图模式

在正常模式按下ctrl+v,即可以进入视图模式。在视图模式中我们可以选中一块区域进行操作包括:删除、注释、缩进等。

在这里插入图片描述

视图模式下各功能的具体操作方法

注意在视图模式里,只能通过h(左)、j(下)、k(上)、l(右)来移动光标。

功能一:批量注释

  • 在正常模式里先把光标移动到要注释的起始地方,然后ctrl + v进入视图模式。
  • 接下来通过h、j、k、l 来选中所有要注释的行。
  • 接着我们按shift + i(即大写字母的i)进入插入模式之后,输入我们的注释符’#‘或者’//’,接着迅速按下Esc键即可完成批量注释,并回到正常模式。

功能二:删除批量注释

  • 正常模式下按ctrl + v进入视图模式
  • 接着我们一样通过h、j、k、l 选择我们刚刚插入的注释符 ‘//’,注意我们必须将两列注释符全部选择到。
  • 接着按d直接删除并回到正常模式

功能三:批量缩进(即批量tab)

  • 在正常模式里先把光标移动到要批量缩进行的开始的地方,然后ctrl + v进入视图模式。
  • 接下来通过h、j、k、l 来选中要缩进的行。
  • shift+ i 进入插入模式后,按tab建然后迅速按Esc完成批量缩进并回到正常模式

功能四:批量反缩进(即shift + tab)

  • 按住ctrl + v 进入可视块模式
  • 通过h、j、k、l 来批量选择我们要删除的空格
  • 最后按d直接删除,并回到正常模式
3.4.5 各个模式的相互切换

正常模式是其他模式的中转站,其他模式只需按Esc就可以进入正常模式,再经由正常模式转到其他模式,如下图所示:
在这里插入图片描述

三. Linux的编译器 — gcc / g++

这里我们看看gcc如何把一个hello.c的源程序最终编译成一个可执行程序hello的。
在这里插入图片描述

1. 预处理

$ gcc -o hello.i -E hello.c

在这里插入图片描述

  • 预处理阶段主要完成:头文件展开、宏替换、条件编译和去掉注释
  • 选项“-o”后面跟的是经过预处理后生成的目标文件,里面存有预处理后的信息。
  • 选项“-E”作用是仅让gcc完成预处理的过程,后面跟的是依赖文件
  • 如果不写明生成的目标文件(即 -o hello.i ),那么“-E”选项执行的预处理操作就会把源程序经过预处理后得到的信息输出到显示器上;如果写明目标文件,就会把这些信息存储到指定的目标文件当中。
    在这里插入图片描述

2. 编译

$ gcc -o hello.s -S hello.i

在这里插入图片描述

  • 编译主要完成:检查语法错误和生成汇编代码
  • 选项“-E”完成编译的过程,如果依赖文件是还未被预处理的源文件,那么会先完成预处理再完成编译,如果已经完成了预处理,就直接进行编译。
  • 如果不写明生成的目标文件,会默认生成同名且后缀为.s的目标文件,里面写有该程序的汇编代码。
    在这里插入图片描述

3. 汇编

$ g++ -o hello.c -c hello.s

在这里插入图片描述

  • 汇编主要完成:把汇编代码转化成二进制机器码
  • 选项“-c”完成汇编的过程,如果依赖文件还未完成预处理或编译,会先完成前面的最后完成汇编。
  • 如果不写明生成的目标文件,会默认生成同名且后缀为.o的目标文件,里面写有该程序的二进制机器码。
    在这里插入图片描述

4. 连接

$ gcc hello.o
  • 连接生成最终的可执行程序
  • 不用加任何选项就是直接完成从预处理到最后的连接过程
  • 如果是多文件编译,在连接这步时要把需要连接的文件都一起写在后面,中间用空格隔开。
  • 如果不写明目标文件,默认生成一个叫做a.out的可执行程序
    在这里插入图片描述

5. 动态库和静态库

5.1 什么是库?

库是写好的现有的,成熟的,可以复用的代码。又因为连接的方式不同分为静态库和动态库。

5.2 静态库

什么是静态库?

在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,这种连接方式叫做静态连接,被打包的库叫静态库。

静态库的优缺点

优点
编译连接成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容。

缺点

  • 可执行程序的文件较大
  • 库更新时,需要重新编译链接

5.2 动态库

什么是动态库?

链接成功后的可执行程序会保留一个指向库的位置,在程序运行时才会去读取库函数来使用。这种连接库的方式叫做动态链接,被连接的库叫做动态库。

动态库的优缺点

优点

  • 可执行程序的文件小,规避了空间浪费问题
  • 实时连接最新的库

缺点
可执行文件无法单独运行,必须保证能够连接到动态库。

5.3 Linux下的连接方式

gcc / g++默认可执行程序,默认是动态链接的。如果想要静态连接,需要我们在连接时手动加上选项 -static

我们有两种方法证明gcc / g++默认生成的可执行程序是动态链接的,在此之前我们先创建几个文件,看下面例子:

我们有个叫做mytest.c的文件
在这里插入图片描述
通过gcc编译连接mytest.c生成可执行程序mytest,注意我们没有加任何其他选项,mytest这个可执行程序是gcc默认情况下生成的。
在这里插入图片描述
接着我们在通过 -static 选项编译链接mytest.c,生成一个静态连接的可执行程序mytest_s
在这里插入图片描述
先阶段我们可以直接地看到:静态连接生成的mytest_s的文件大小是mytest的100倍多一点。可以推测默认编译连接形成的mytest很可能是动态链接的。

我们可以通过两条指令file和ldd来具体的查看它们的连接方式和库。

指令一file + 可执行程序名称
file指令用来识别文件类型,也可用来辨别一些文件的编码格式。

通过file目录指令分别查看这两个可执行程序,明确写着mytest是动态链接的,mytest_s是静态链接的。
在这里插入图片描述
指令二ldd + 可执行程序名称
ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系,这也就是该指令的作用。

补充几点:Linux中动态库的扩展名通常为 libxxx.a ,而静态库的为 libxxx.so 差别就是后缀不同,动态库后缀为 .so ,静态库后缀为 .a

回到我们的例子我们只想 ldd + mytest,结果我们可以找到它动态库的名称是 c ,即mytest是动态链接的。
在这里插入图片描述
看看静态链接生成的mytest_s,执行 ldd mytest_s
在这里插入图片描述
结果告诉我们他不是动态链接的可执行程序。综上我们可以得到最终的结论,gcc / g++默认生成的可执行程序时动态链接的,想要静态链接,需要我们在连接时手动加入 -static 选项。

四. Linux的调试工具 — gdb

1. 检查调试信息

1.1 生成debug模式的程序

程序的发布方式有两种,debug模式和release模式,Linux中gcc / g++编译链接生成的二进制程序,默认是release模式,此时是没有调试信息的。要使用gdb调试,必须要有调试信息即debug模式,只需在编译的时候, 加上 -g 选项。

1.2 检查是否带有调试信息

方法一:直接对程序进行gdb调试

直接对该可执行程序进行调试,执行 gdb + 程序名称 开始调试,如果没有调试信息它会告诉你:(no debugging symbols found)。
在这里插入图片描述
如果有调试信息的话就不会出现括号里的话(no debugging symbols found)
在这里插入图片描述

方法二:通过readelf指令查看调试信息

readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件、动态库(.so)、静态库(.a) 等包含ELF格式的文件。其中选项 -S作用是显示节头信息(如果有数据的话)。

指令:readelf -S 可执行程序名称 | grep debug

对于没有调试信息的可执行程序,不会打印出任何东西
在这里插入图片描述
如果有调试信息,它会筛选打印出来
在这里插入图片描述

2. 开始调试和退出调试

开始:gdb + 可执行程序名称

退出:quit 或 ctrl + d

3. 具体操作方法

gdb有记忆功能,什么都不用输入,按回车自动自行上一条指令,上下方向键可以查看之前输入过的指令。

l + 行号:列出代码,一次列10行

r:运行代码

b + 行号:在指定行上打断点

d + 断点编号:删除断点,不指定断点编号的话就是删除所有断点

info + b:查看所有断点信息

c:跳转到下一个断点

n:逐语句

s:逐过程

p + 变量名:查看变量的值

display + 变量名:踪查看一个变量,每次停下来都显示它的值

undisplay + 变量编号:取消对先前设置的那些变量的跟踪

until + 行号:跳转到任意行

finish:直接运行完当前所在的函数

五. Linux的项目自动化构建工具 — make/Makefile

1. 什么是make和Makefile?

Makefile是一个文件,里面写我们编译的指令。
make是一条命令,用来执行Makefile里的编译指令。

2. 为什么要有make和Makefile?

如果遇到更多的源文件需要编译和共同连接时,运行的话用gcc就要把所有的源文件的名字写在一起,其中一个写错了,检查起来会很麻烦。我们可以把编译的指令存到Makefile文件里统一管理,通过make来执行编译操作,达到一键编译运行效果,极大的提高了软件开发的效率。

2. Makefile的使用

比如我们这里来实现一个简单的进度条功能,创建三个文件:proc.h、main.c、proc.c和Makefile
在这里插入图片描述

Makefile

我们先写好Makefile文件的内容,确保各个文件都能顺利完成编译和最后的连接。

依赖关系
以冒号分隔,左边是目标文件,右边是生成目标文件所需要的依赖文件
在这里插入图片描述
依赖方法

  • 依赖方法是写在对应依赖关系下面的具体操作方法
  • 依赖方法必须以tab开头,不能通过空格一个个的打!
    在这里插入图片描述

执行的顺序

下面是我们进度条Makefileli的内容,整体是从上往下执行,先看依赖关系中的依赖文件是否存在,如果存在就执行对应的依赖方法;不存在的话就跳过依赖方法往下找生成依赖文件的依赖关系和依赖方法,生成前面指令想要的依赖文件,生成后再这回来执行指令。

PS:这里连接时可以不写明proc.h这个头文件,只要proc.c或main.c只要包含了它,系统就会自动到当前目录下找这个我们自己写的头文件来连接的。
在这里插入图片描述
这时我们只要输入命令make就可以完成整个进度条程序的编译工作了。可以看到这里的执行顺序:先执行编译指令,得到编译好的文件后执行连接指令。
在这里插入图片描述

伪目标完成项目的清理工作

我们还可以在Makefile中实现一个用来清理生成的目标文件和可执行程序的命令,以便对源程序代码修改后可以快速清理和重编译,一般我们把这种命令设置为伪目标,用 .PHONY 修饰

我们给目标文件取名为clean,不需要依赖文件,因为我们的主要目的是执行下面的依赖方法。像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
在这里插入图片描述

伪目标的特性.

伪目标的特性是总是被执行的,即随时都可以被执行,即使没有对应的文件。
在这里插入图片描述
而真目标执行一次后如果你再次执行,它会提示你这已经是最新的了。
在这里插入图片描述
那么我们最终整合伪目标后看看Makefile的文件内容:
在这里插入图片描述

Makefile中的宏定义

  • $():替换成括号里面的内容
  • $@ :依赖关系中的目标文件
  • $^ :依赖关系中的依赖文件列表
  • $< :分别取出依赖关系中的一个个依赖文件,执行相同的指令

宏替换可以使得程序更加灵活和简洁,把具体的文件名取别名替换,这样修改时只需要别名的内容就行。
在这里插入图片描述

具体进度条的实现

proc.h
包含需要的头文件和定义一个宏定义NUM表示进度条字符的数量
在这里插入图片描述
main.c
在main函数里调用proc()函数
在这里插入图片描述
proc.c
具体进度条的实现,用"#"模拟加载的过程,最右边是代表加载程度的百分比和一个循环转动的线条。

要注意的是printf函数是行缓冲函数,满足下面条件之一才会将缓冲区刷到对应的文件(一般是stdout即显示器)中。

  1. 缓冲区被填满
  2. 写入的字符中有’\n’或’\r’
  3. 调用fflush手动刷新
  4. 程序结束

观察我们下图的程序,printf本来要输出到显示器上的内容一直被存放在缓冲区里,不满足我们的连续加载效果的要求,所以我们要调用fflush手动刷新缓冲区。
在这里插入图片描述

每进入一次循环就刷新一次缓冲区,使得前面printf的内容输出到显示器
在这里插入图片描述

3. make的工作原理

make是如何工作的,在默认的方式下,也就是我们只输入make命令

  1. make会在当前目录下找名字叫“Makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“proc”这个文件, 并把这个文件作为最终的目标文件。
  3. 如果proc文件不存在,或是proc所依赖的后面的 proc.o和main.o 文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么他就会执行后面所定义的命令来生成 proc.o和main.o 这个文件。
  4. 如果proc所依赖的 proc.o和main.o 文件不存在,那么make会在当前文件中找目标为 proc,o和main.o 文件的依赖性,如果找到则再根据那一个规则生成 proc,o和main.o 文件。
  5. 当然,你的 proc.c和main.c 文件是存在的,于是make会生成对应的 .o文件,然后再用 proc,o和main.o 文件执行make的终极任务,也就是生成可执行文件proc
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LInux】基础开发工具的使用 的相关文章

  • 我们如何在使用循环时调用 ansible playbook 中的变量

    我有两个文件 其中这些文件包含server names and server IP s 我想更改 替换一些特定的server names and IP addressees根据要求在两个文件中 这与这篇文章 因为它被要求开设一个新职位 ht
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 选择fasta文件中氨基酸超过300个且“C”出现至少4次的序列

    我有一个包含蛋白质序列的 fasta 文件 我想选择超过 300 个氨基酸且半胱氨酸 C 氨基酸出现超过 4 次的序列 我使用此命令来选择具有超过 300 个 aa 的序列 cat 72hDOWN fasta fasta bioawk c
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 如何在线程创建和退出时调用函数?

    include
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下

随机推荐

  • 鲸鱼优化算法论文【matlab代码与仿真】

    一 算法流程 通过回声定位并相互传递探寻猎物信息 研究表明 鲸鱼大脑的某些区域与人类相似 有一种叫做梭形细胞的共同细胞 这些细胞负责人类的判断 情感和社会行为 这种细胞的数量是成年人的两倍 事实证明 鲸鱼可以像人类一样思考 学习 判断 交流
  • 从Kubernetes 1.14 发布,看技术社区演进方向

    Kubernetes 1 14 正式发布已经过去了一段时间 相信你已经从不同渠道看过了各种版本的解读 不过 相比于代码 Release 马上就要迎来5周岁生日的Kubernetes 项目接下来如何演进 其实也是一个让人着迷的话题 而作为一个
  • 在linux中,&和&&,

    对应刚接触linux命令的小伙伴们来说 这些符号一定是很困扰的下面我们一起来看这些符号区别和用法 表示任务在后台执行 如要在后台运行 如 root localhost local java jar test jar gt log txt 运
  • 大型 SaaS 平台产品架构设计

    当我们去搜索 架构 可以得到很多的架构图片 比如组织架构 业务架构 数据架构 技术架构 安全架构 产品架构 部署架构等 什么是架构 通常大家说架构一般指软件架构 架构是指软件的基础结构 创造这些基础结构的准则 以及对这些结构的描述 在这个定
  • IAR常见报错

    右键进入函数出错 project gt clean
  • 利用python进行数据分析之数据聚合和分组运算--小白笔记

    GroupBy机制 split apply combine 拆分 应用 合并 import pandas as pd import numpy as np df pd DataFrame key1 a a b b a key2 one tw
  • 找不到匹配的host key算法

    vim etc ssh sshd config
  • 《WebRTC系列》实战 Web 端支持 h265 硬解

    1 背景 Web 端实时预览 H 265 需求一直存在 但由于之前 Chrome 本身不支持 H 265 硬解 软解性能消耗大 仅能支持一路播放 该需求被搁置 去年 9 月份 Chrome 发布 M106 版本 默认开启 H 265 硬解
  • raw格式详解

    raw格式是camera sensor直接输出的格式 每个像素点表示一个颜色分量B G或R 注意 这句话不准确 红外相机的sensor和彩色相机的sensor有些不同 有的红外相机的sensor输出的raw data就是亮度值 即灰度值 输
  • Android Flutter开发环境搭建

    1 搭建 Flutter 开发环境 本栏亦在快速上手Android Flutter Flutter框架就不介绍了 框架这个东西怎么说呢 对于大部分人来说只是了解即可 如需了解的话 可以度娘资料很多 本节我们主要看下如何在Windwos下搭建
  • Kotlin协程实现原理:CoroutineScope,看完不懂你砍我!墙裂建议收藏。

    今天我们来聊聊Kotlin的协程Coroutine 文末有为大家准备的彩蛋 如果你还没有接触过协程 推荐你先阅读这篇入门级文章What 你还不知道Kotlin Coroutine 如果你已经接触过协程 相信你都有过以下几个疑问 协程到底是个
  • 一个码稿人自述:什么样的文档产品适合我?|深度吐槽

    关注ITValue 看企业级最新鲜 最价值报道 图片来源 Unsplash 钛媒体打工人 媒体相关从业经验4 5年 文档使用重度患者 今天以我曾经用过的 和现在主流的一些文档产品为例 来谈谈我的使用体验 以及什么样的文档适合我 一 我与文档
  • [编程工具]MarkDown编辑查看以及使用语法

    目录 0 前言 1 markDown语法 2 markDown 3 MD正确打开方式 4 结尾 结束啦感谢观看 5 参考连接 0 前言 本文介绍了markDown的编辑查看 使用浏览器查看以及Vscode中查看编辑MD 最后介绍了MD的常用
  • python解析佳明fit文件

    使用 fitparse 解析 佳明 fit 文件 以下示例测试环境为 python 3 8 fitparse 1 2 fitparse 安装 pip3 install fitparse 使用方式 import fitparse from d
  • 蓝牙通讯

    蓝牙通讯 简介 蓝牙API 所需权限 使用蓝牙的步骤 普通调用案例 通讯案例 简介 蓝牙 是一种支持设备短距离通信 一般10m内 且无阻隔媒介 的无线电技术 能在包括移动电话 PDA 无线耳机 笔记本电脑等众多设备之间进行无线信息交换 利用
  • 数据库创建索引和删除索引的方式总结

    一 创建索引 1 1 使用Alter创建索引 1 添加主键索引 特点 数据列不允许重复 不能为null 一张表只能有一个主键 Mysql主动将该字段进行排序 ALTER TABLE 表名 ADD Primary key col 2 添加唯一
  • MySQL安装与启动

    1 MySQL安装包下载 下载地址 https dev mysql com downloads mysql 这里我的电脑是WIN764位的 大家根据自己的电脑自己选择要下载的包 2 解压安装 解压后进入到Windows的DOS命令行下 切换
  • python股票量化交易系统_利用python建立股票量化交易系统(一)

    从今天开始正式开启我的博客之旅 博客内容全部是我自己的量化心得 主要还是为自己将来中工作之中遇到相似问题 可以方便的找到答案 如果能帮到有相似问题的其他同学 我也很开心 如果帮不到的话 不喜勿喷 如果文章中有什么不对的地方 欢迎批评指正 建
  • VI编辑器的使用常用快捷方式编辑命令

    VI编辑器的使用常用快捷方式编辑命令 一 VI编辑器的工作模式 1 VI编辑器有以下三种工作模式 命令模式 输入模式 末行模式 2 不同模式之间的切换 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 7BrI0o
  • 【LInux】基础开发工具的使用

    文章目录 一 Linux的应用市场 yum 1 什么是yum 2 为什么要有yum 3 如何使用yum 3 1 前提条件 3 2 搜索软件 3 3 安装软件 3 4 卸载软件 二 Linux的文本编辑器 vim 1 什么是vim 2 为什么