Linux 基础语法 -2

2023-11-07

 如果我们以后再Linux当中 写了一些命名,导致程序我们不能进行操作了,如这个死循环:

 他就会一直输出 "hello Linux"  ,我们就使用 ctrl + c  来终止因为程序或者指令异常,而导致我们无法进行指令输入:

 

*   通配符

 它的意思是所有,比如我们使用 ls 来访问当前路径下(除隐藏文件下)的所有文件:

 他可以访问,当前路径下的所有文件。

例如:

 我们使用 " * " 可以匹配任意 名称的文件:

*. xxx 

 访问以 xxx 为后缀的文件,例如:

 上图中,就是访问 此路径下的所有以 .c  为后缀的文件。

xxx . *

 访问所有 以xxx 为文件名的文件,例如:

 上图中,就是访问 此路径下的 所有 文件名为 test 的文件。

rm * -rf

 这样就可以删除本路径下的所有文件和文件夹:

 此时 ls  无内容。

如上述的  rm -rf xxx.xxx 这个命名还可以 这样写  :  rm xxx.xxx -rf  这样写,但是我们一般建议是按照第一种方式去书写,因为第二种方式的命令有些环境可能不兼容,如上述的rm xxx.xxx -rf 这个命令,在 macOS 当中 也有终端  这个终端也是 Linux 指令 ,可能就不兼容。

man指令

 Linux的命令有很多的参数,我们可能会记不住,而 man指令可以帮我们查看联机手册获取帮助。

语法:

man [选项] [命名]

比如现在我们来查看 rm 指令的联机手册:

man rm

 man man  查看这个手册的使用方法:

 手册:

  • 1 是普通的命令
  • 2 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么文件)
  • 3 是库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件
  • 5 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
  • 6 是给游戏留的,由各个游戏自己定义
  • 7 是附件还有一些变量,比如向environ这种全局变量在这里就有说明
  • 8 是系统管理用的命令,这些命令只能由root使用,如ifconfig
     

我们发现当中有这 9 个接口,分别对应这不同的手册。 

当我们 man pirntf 想去查看C语言的当中的  printf() 函数的时候,发现printf()不仅仅作为C语言当中的函数,还作为 Linux 当中的一条指令:

 

Linux当中的printf和C当中的printf()没有任何的关系,一个是指令,一个是函数。

使用 man 3 printf  就可以查这个printf的相关函数:

 那么如果我们在使用man 指令再查的时候,后面都没有带 1 这样的手册,直接进行查指令的话,那么他会从 1 号手册开始查找,找到了就直接返回这个 手册当中的指令,如果没有找到,会按照 1 2 3 ······ 等等这样的顺序在 手册中进行查找。

 如果上述都没有找到,那么就会说,没有这个指令:

 当然,man 也是有 一些选项的,不过我们一般查的话,就是上述的几种方式来就差不多了。

man 的选项:

  • -k 根据关键字搜索联机帮助
  • num 只在第num章节找
  • -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用a选项当按下q退出,他会继续往后面搜索,直到所有章节都搜索完毕
     

 cp指令

  作用是赋值 文件或者是目录。

语法:

cp [选项] 源文件或目录 目标文件或目录

 拷贝文件:

 如这个例子:

 上述两个文件的大小都是 24 ,大小是一样的。

 上述我们拷贝到的新的文件中,这个文件可是原本就有的,也可以没有的,如果没有就会直接创建。

如果是已经存在的文件,加上 -i  选项就会问我们是否进行覆盖:

 选择 y 就是代表覆盖。

如果我们没有使用 -i  选项,那么就会默认进行覆盖:

 如上述例子,第二次拷贝的时候,没有提醒,但是这是在 普通用户下的,如果是root 用户他会默认来问我们是否覆盖。

同样的,如果拷贝的文件和被拷贝的文件是一样的,是不行的,这样是没有意义的;

 那么上述是拷贝到当前目录下,如果我们想要拷贝到其他路径之下,我们可以这样操作:

目标文件不仅仅可以使用文件名,还可以使用绝对路径:

 拷贝目录:

 

 如上述的目录,我们也可以用 cp 来进行拷贝,但是不能像之前一样直接进行拷贝:

 如何我们需要拷贝目录,需要 -r  选项:

 因为目录使用递归定义的,我们在拷贝的时候就需要使用递归的形式来进行拷贝。如上述,我们拷贝了一个 lesson3_backup。

我们使用 tree 来打印这个目录:

 发现和 lesson3 目录是一样的。

总结

  •  f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
  • -i 或 --interactive 覆盖文件之前先询问用户
  • -r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符链
  • 接,则一律视为普通文件处理
  • -R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理

echo指令

 直接使用 echo 字符串   的话就会在屏幕上直接输出 这个字符串:

 如果我们使用  echo 字符串 > 文件名.后缀  这样写的话,就会把这个字符串 流入 到这个文件当中:

信息写入到文件中之后,就不会再屏幕上打印了。

 而上述的 " > " 这个叫做 输出重定向,他会将本来应该显示在屏幕上的内容,打印到文件当中。

 mv指令

 用来移动文件或者将文件改名,经常用来备份文件或者目录。

语法:

mv [选项] 源文件或目录 目标文件或目录

同路径下使用就是重命名,而我们可用mv指令实现剪切。

重命名:

 

 在同一路径下,这个文件名就被修改了。

我们也可以把这个文件剪切到其他路径下:

 剪切并重命名:

 

 我们可以这里理解这个 mv ,其实mv 所以的操作都是 剪切并重命名,如果我们有新的名字,就用新的名字,如果没有,就使用原本的名字,如果有新的路径,就使用新的路径,如果没有新的路径,就是默认是当前的这个路径。

 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中:

 

 这个命令不是把 dir 这个目录 剪切覆盖 newdir 这个文件夹,当我们把查看这个上级目录发现,只是把dir 剪切到上级目录当中:

Linux 当中指令是什么

 如果我们写一个 C 语言的 .c  源文件,那么我们进行 gcc 编译,然后生成可执行文件,假设是 a.out ,那么我们是 ./a.out  这样来执行的可执行文件的,而回想我们上述执行执行的时候,也是直接 输入指令,回车然后这个指令就执行了。

其实指令和可执行程序都是可以被执行的,其实指令就是可执行程序。

 那么在Linux当中中的指令在哪儿呢?

 当我们输入一条 Linux 当中没有的指令的时候,他会报  command not found  这样的错,也就是说,如果我们想要执行一条指令,那么先要找到这条指令。找到了就执行。

 所以指令一定是在系统当中的某一个位置存在的,一般的指令是在 根目录下的 usr 的 bin 目录下的:

/usr/bin/

 指令是在系统的特定路径下存在的,这些指令一定是某种 shell 脚本,c,c++,python等等实现的可执行程序。

 那么我们之前写的 a.out  这也是一个执行程序啊,如果我们把这个 a.out 可执行程序放进这个/usr/bin/ ,bin 目录下,那么我们是不是也可以写一个指令了呢?

答案是可以的。 

 如下图所示:

 这种行为,就叫做安装软件。也就是把我们写好的 可执行程序,放到 bin 目录下,这样我们在调用这个 可执行文件的时候,就可以不用 用路径来访问这个可执行文件了。

 那么对应的 ,如果我们使用 rm 来删除我们刚刚写入的 mycmd  这个可执行文件,在Linux 当中就叫做 卸载。如下图所示:

 此时编译器就不能使用这个指令了:

 alias 指令

给指令取别名,如下面这个例子:

 把 ' ls -l -i -a -n '  这个指令 取了一个  108_cmd 这个别名,那么以后我们在使用 ' ls -l -i -a -n '  这个指令的时候,就可以直接 使用 108_cmd  这个别名来调用,两个实现的效果是一样的l: 

 如果我们没有取别名,那么我们使用 108_cmd 这个是会报错的。

我们使用 which  来查看这个一个指令的 所在路径和 属性:

 发现上述就有 alias  这个定义了。

如果有一天,我们不想用这个 别名了,那么我们就可以再用一次 alias 把这个108_cmd 置空:

 然后,当我们调用 108_cmd 这个时候,就什么都没有了,而且我们使用which 查看这个 属性的时候,发现是空的,如上图所示。

那么如果我们写了  alias xxx = " "; 这样的命名,那么如果之前这个别名是有用的,当我们这个Linux 操作系统的之后(上述是在 xshell 上登录的云服务器,就重启 xshell ),那么我们再次调用这个别名,发现就会报错了:

cat指令

 在Linux当中,一切都可以认为是文件

 比如显示器,键盘,普通文件····这些都可以看做是 文件。

 在显示器当中,可以认为有 一个 向显示器文件当中书写函数 ->fwrite(),但是显示器当中有读这个函数->fread(),但是这个读函数当中的实现是空的,因为显示只负责向我们显示数据。那么我们在使用 scanf()这样的函数在输入的数据的时候,在屏幕上我们也是能看到我们输入的数据啊,那么显示器不是接收这个数据,也就是在读这个数据吗?

其实不是的,因为我们输入的数据是从键盘输入的,而显示器只是把我们输入的数据再显示器上在显示出来,让我们知道我们输入的数据是多少。

而键盘当中就有读这个函数->fread(),相当于是从键盘设备中读取数据,但是他只负责输入,不负责输出,那么键盘当中我们可以认为有写这个函数-> ->fwrite(),但是这个函数中的实现是空的。

那么在普通文件当中,既可以写入,也可以读出,那么它fwrite()fread()这样两个函数都是有实现的。

那么在Linux 当中,只要是能被读,或者是被写的,都可以看做是文件,都可以有读写访问,称为IO。

那么在电脑上还有很多的设备,比如网卡,等等这些都可以看做是文件,网卡也是需要抒发数据的。

比如我们写入下面这个C代码:

int main()
{
    int a = 10;
    printf("请输入数字\n");
    sacnf("%d",&a);
    printf("%d",a);
}

我们在键盘上输入数据,和在显示器上输出,都是文件在输出会让输入。

 那么之前写的 echo 字符串,是把字符串输出到显示器文件当中;echo 字符串 > xxx.txt 就是把原本需要输出到显示器当中的字符串输入到 xxx.txt  这个文件当中。

那么上述的行为,就被认为是重定向。上述就是把原本要输入到显示器当中的字符串输出到文件当中。

 当我们直接写 cat ,如下所示,我们发现,我们输入什么,屏幕上就会打印什么:

 如果我们cat 后面什么都不写,他会默认从键盘读取数据,然后默认在显示器上进行打印(输出)

 -n 选项

 把输出结果的每一行搞一个编号:

 -b 选项

 给非空的行创建编号:

 

 发现非空行就有编号,而空行就没有编号。

 -s 选项

 不输出多行的空行:

如上述例子:

 发现上述的多个空行,输出了一行空行。

 cat不适合看大文本,适合看小文本:

  写一个简单脚本,生成 1- 10000 个 "hello Linux i" 到text.txt 文件当中:

cnt=1; while [$cnt - le 10000]; do echo "hello Linux $cnt"; let cnt++; done > text.txt

如上述的大文本,看起来很不方便。

echo 和 cat 的区别

 echo 后面跟的是一个字符串,而cat 后面跟的是一个文件,看下面这个例子就知道区别在哪了:

cat out.txt
#输出
hello Linux
echo out.txt
#输出
out.txt

我们发现 cat 输出的是文件当中内容,而echo 输出的是 out.txt 这个字符串。

 > 和 >>   

 >  : 输出重定向

 当我们使用 多次 echo 向同一个文件当中,输入相同的字符串,然后使用cat 来 输出文件当中内容,我们发现,只输出了一个字符串:

 而且,在上述之后,我们在 用 echo输入 别的字符串,发现之前写的 hello Linux 这个字符串都不在了,打印的是新输入的字符串:

 这是因为,这里的 " > "  输出重定向,这个操作符,在使用的时候,都是像 文件当中的开头位置,开始覆盖式的写入的,也就是说,我们上述的行为,每一次都是在原文件内容的基础之上,在开头位置进行覆盖式的写入,把原本的数据给覆盖掉。

 而且上述的覆盖式分为两步:

  • 首先要把文件当中内容给清空
  • 然后再把内容输入到文件中

 所以,我们可以使用这个 ">" 清空的特性来把文件当中的内容给清空:

>out.txt

 

如果我们不想删除文件当中本来的内容,直接在之后输入,那么我们可使用 " >> " 追加重定向

 如上图,我们插入了多个 108 good 。

" >> " 追加重定向这个操作都是在文件的结尾来进行写入。

 如果我们以后想创建一个新的文件,不需要使用 touch 类似的命令,直接像下述一样写也可以创建文件:

 

 < 

我们之前说过了,如果cat 后面什么都不跟,那么他会默认从键盘上读取数据,那么如果我们在后面输入 " <  xxx.txt" 这个,就会从 xxx.txt 这个指定的文件当中读取数据。

> : 输入重定向

more 指令

 more和cat的功能差不多,但是:

  我们之前说过,cat 指令不适合来看大文本,那么查看大文本,我们就可以使用 more指令来看:

这样我们就可以查看 这个文档了:

 他会把文件当中的内容,在屏幕上打印出来,把屏幕占满,然后就不在打印了。这个时候,我们按下 Enter 他会自动往下翻,比较适合我们自顶向下的来查看。按q就可以退出。

 我们可以在more场景当中使用  /数字 这种形式来直接跳到某行。

 

 

 -数字

 使用 -数字 这种方式就可以直接显示到文件当中的直接行数:

 

 less指令

 less的功能和more有些重叠,但是less功能更加强大。按↑他是上翻,按↓他是下翻,所以less他支持上下翻动。

相关选项:

  • -i 忽略搜索时的大小写
  • -N 显示每行的行号
  • /字符串:向下搜索“字符串”的功能
  • ?字符串:向上搜索“字符串”的功能
  • n:重复前一个搜索(与 / 或 ? 有关)
  • N:反向重复前一个搜索(与 / 或 ? 有关)
  • q:quit
     

 关于大文本

 我们上述的 less 和 more  都是在查看 大文本,那么我们为什么要看一个大文本呢?什么属于大文本呢?

 在大型项目中,我们想要查找我们想要的一些代码段等等,都可以用到大文件的查看;还有日志,比如你有一个服务器,这个服务器挂掉了,那么可以查看日志来查看它为什么挂掉了。

 head指令

 也是用于查看文件,只不过他是只给我们查看前 n 行内容。

其中的 n 默认是10,我们也可以 用 - 数字 的选项来规定 n 的大小。

 

 tail指令

 从文件的末尾开始查看文件,查看末尾的后 n 行内容,

同样n 默认是10,我们也可以 用 - 数字 的选项来规定 n 的大小。

 

 tail 指令常用与查看日志,假设日志已经写了 10 万行了,那么我们不可能从头开始看,这时候就可以用 tail 来查看后面的日志。

tail和head的妙用

 假设现在有 10000 行的内容,但是我们想查找其中的 1000 - 1020 行的数据,我们当然可以用 less 进去用 / 1000 来访问到1000行,但是其实还可以用 tail和head 结合使用来实现:

先用head 把前 1020 行内容重定向到一个新的文件的当中:

 然后再用 tail 访问这个 文件的 后 20 行就可以得到 1000 - 1020 行的数据了:

 

 

 |

 | : 管道文件

 那么对于上述的tail和head,还可以这样使用:

 

 | 就是一种符号,后面会被“系统”解释称为管道文件,这个管道文件不是在磁盘里存在的,而是一种内存级的文件,其对于的执行逻辑如下图所示:

 这里管道的意思就是用来传输资源的。

我们知道,当我们在访问文件的时候,因为文件是在磁盘中的,要先把磁盘中文件对应的内存拷贝到内存来进行访问,而磁盘当中文件,在访问完之后,要把内容重新刷到磁盘上吗,而内存级的不用。

 wc -l 数计算行数的命令,像上述的操作,就是 管道 支持的流水线操作。

 他可以把数据,一步一步进行加工,从而拿到我们想要的内容。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 基础语法 -2 的相关文章

随机推荐

  • 毕业设计——基于深度学习的手势识别以及手势交互功能(TensorFlow)(YOLO)

    目录 前言 1 背景介绍 2 项目简介 3 环境配置 配置介绍 版本 4 模型实现 数据集制作 手势训练 模型评估 识别效果 5 GUI界面以及手势交互的实现 区域介绍 展示 初始页面 识别页面 多媒体控制页面 6 结语 前言 今天 向大家
  • 【iOS】跳转邮箱发送邮件,支持系统内多个邮箱的方案 swift 实现

    我们永远无法知道运行应用程序的iPhone iPad是否安装了Apple的Mail应用程序 因为用户可以删除它 一 前言 网上一般都让这么写 let email foo bar com if let url URL string mailt
  • ubuntu apt-get grade 报错11: Resource temporarily unavailable

    ubuntu更新源时报错 报错详细提示如下 E Could not get lock var lib dpkg lock frontend open 11 Resource temporarly unavailable E Unable t
  • Android中View.inflate()

    Inflate可用于将一个xml中定义的布局控件找出来 因为在一个Activity里如果直接用findViewById 的话 对应的是setConentView 的那个layout里的组件 因此如果当前Activity里需要用到别的layo
  • 图像数据流识别圆形_我的电赛作品:BP算法鸟类图像识别系统

    作者 我的果果超可爱 本文由面包板社区版主原创 未经本人允许 禁止转载 不知不觉已经12月了 经过2020这个魔幻的一年 回想当年参加电子竞赛 仿佛回到了念书的快乐时光 不知不觉已经好几年了诶 任时光匆匆流走 我们还剩下什么呢 好了言归正传
  • CUDA10.0 官方手册 章三 CUDA编程接口

    因为这章内容比较碎 不好提炼 大部分为原文翻译 人工翻译 不是机器翻译 抵制不负责任的机翻从你我做起 翻译不易 转载贴上出处 630056108 qq com 目录 3 1 用NVCC编译 3 1 1 编译工作流 3 1 2 二进制兼容性
  • IPv6表示方法与配置案例

    1 IPv6地址格式 IPv4地址长度32位 IPv6的地址长度为128位 是IPv4地址长度的4倍 采用十六进制表示 表示方式如下 冒号分隔十六进制表示法 格式为X X X X X X X X 其中每个X表示地址中的16个二进制B 十六进
  • Tkinter批量截取log

    http automap bj bcebos com mapautozip 5 3 0 20201020 repacked path for 10x adas BaiduNavi china zip usr bin python codin
  • react获取经纬度

    useEffect gt if navigator geolocation navigator geolocation getCurrentPosition position gt const latitude position coord
  • Kubernetes学习之路(一)之概念和架构解析和证书创建和分发

    1 Kubernetes的重要概念 转自 CloudMan老师公众号 每天5分钟玩转Kubernetes https item jd com 26225745440 html Cluster Cluster 是计算 存储和网络资源的集合 K
  • C++Builder下利用TImage制作二维条码PDF417打印控件(五)

    接上文 字节压缩6 void TPDF417 byteCompaction6 pPdf417class p int start int length 6 char text p gt param gt text int ret p gt p
  • el-date-picker日期选择器

    先看效果 给绑定事件change或blur事件具体看需求
  • 计算机网络——主机IP地址、子网掩码、广播地址、网络数、主机数计算方法

    目录 一 概念 1 1 主机IP地址 1 2 子网掩码 1 3 广播地址 1 4 子网划分 二 计算 2 1 已知IP地址和子网掩码 计算网络地址和主机地址 2 2 已知IP地址和子网掩码 计算广播地址 2 3 已知子网掩码 计算主机数 2
  • DCMTK读取dcm图像

    医学图像处理中的图像格式通常为dcm格式 在C 中读取使用可以通过DCMTK库中的接口函数来实现 通常文件的读取步骤如下 使用DcmFileFormat类构造最基本的文件对象 使用loadFile 函数读取文件 并通过OFCondition
  • Python 思维锻炼

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 程序1 数字组合 程序描述 有四个数字 1 2 3 4 能组成多少个互不相同且无重复数字的三位数 各是多少 程序分析 可填在百位 十位 个位的数字都是1 2 3 4 组成所
  • uniapp 实现下载pdf格式文件

    processContractUrl params then res gt 调后端接口 返给url console log res uni downloadFile url res data url 调接口返给的url success fu
  • Vivado-FIFO Generator

    很全很详细的FIFO Generator IP核的使用规则 FIFO Generator IP核的使用 1 概述 1 最大支持500M 2 支持三种接口 Native interface FIFOs AXI Memory Mapped in
  • ansible lookup例子

    lookup 读取csv 通过lookup方式 将用户密码把独立到credentials csv文件中 credentials csv Credentials File Hostname Password web server Passw0
  • shell脚本输入密码

    平时在控制台输入指令如 sudo ssh ftp或者修改admin权限的文件时候都会要求输入password 但是在she ll脚本运行过程中该如何交互实现自动输入密码呢 下面总结三种实现方法 一 重定向 用重定向方法实现交互的前提是指令需
  • Linux 基础语法 -2

    如果我们以后再Linux当中 写了一些命名 导致程序我们不能进行操作了 如这个死循环 他就会一直输出 hello Linux 我们就使用 ctrl c 来终止因为程序或者指令异常 而导致我们无法进行指令输入 通配符 它的意思是所有 比如我们