热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux学习笔记之八(重定向下和匿名进程管道)

接七。给出上一讲没有给出的一个例子。上一讲讲的其实是输出重定向。今天我们来学习输入重定向。输入重定向上一讲已经说过procpidfd里面的0这个文件描述符对应的是标准输入&#x

接七。给出上一讲没有给出的一个例子。

上一讲讲的其实是输出重定向。今天我们来学习输入重定向。

输入重定向

上一讲已经说过/proc/pid/fd里面的0这个文件描述符对应的是标准输入&#xff0c;>或者1>是正确的输出&#xff0c;2>是错误信息&#xff0c;当然还有其它方式&#xff0c;上一讲里都有&#xff0c;0<&#xff0c;或者简写为<&#xff0c;就是输出的重定向符号&#xff0c;下面是一些例子。

第一个是发邮件的例子&#xff0c;需要先安装sendmai软件包和mailx。yum -y install sendmail mailx 即可。这里我试了一下&#xff0c;还必须要改/etc/hosts。在自己虚拟机的ip哪一行加一个主机名字加.com就可以了。效果如下&#xff1a;

下面才是我们重定向的重点。如何给一个用户发邮件呢&#xff1f;

mail 用户名就可以发给它邮件了&#xff0c;回车输入主题&#xff0c;再回车输入内容&#xff0c;怎么结束呢&#xff1f;另起一行&#xff0c;在行头打.回车就会自动出现EOT&#xff0c;就停止了。然后我们mail可以查看邮件,不加-u指定用户的话是看lcl用户的邮件&#xff08;当然你还要有权限看&#xff09;

root用户下mail -u root就可以看到刚才发给它的邮件了。左侧有一个邮件编号。在&后输入编号回车可以查看某一编号的邮件&#xff0c;输入q退出。上面这种是没有用到重定向的方式。

下面看一看重定向的方式&#xff1a;

重定向指定的是邮件的内容&#xff0c;主题得自己用-s指定了&#xff0c;后面必须加引号的。当然主题是可以为空的&#xff0c;如果你用了重定向而没有指定-s&#xff0c;那么主题就是空的。


案例2还是来看一下&#xff1a;

cat如果你不给文件路径就按回车&#xff0c;效果就是输入时默认从键盘输入&#xff0c;然后呢&#xff0c;你输什么回车它会重复打出来什么&#xff0c;grep呢&#xff0c;是你输入一行回车就过滤一行。给文件路径就可以有两种方式了&#xff0c;一种是作为参数&#xff0c;也就是不加<&#xff0c;一种是用输入重定向,这两种方法的不同就在于参数的个数不一样&#xff0c;效果是一样的&#xff0c;不过显然完全可以不加<&#xff0c;这里只是举例子而已&#xff0c;而且我试了一下重定向的参数按esc.也可以得到。

11.txt是通过输入重定向的方式作为cat的输入的&#xff0c;但是esc.也可以直接调出来。

案例三还是有点意思的&#xff0c;先来看dd命令。

只需要能看懂案例里的命令就可以了&#xff0c;不需要去细究。

再来看什么叫做/dev/zero文件。参考了https://blog.csdn.net/pi9nc/article/details/18257593

这个命令还是有点意思的&#xff0c;下面就会看到。

我们用df来看一下我们给的磁盘大小。

当时给的是50个G,上面加起来差不多。

但是呢&#xff0c;我们却能看到几百PB大小的文件。

当然这是假的&#xff0c;我们用了seek跳过了很多个块&#xff08;block&#xff09;&#xff0c;file1.txt的真实大小只有1M&#xff0c;我们今天学习的重点不在于此&#xff0c;只是看一下。另外我们还看到dd可以测试磁盘的读写速度&#xff0c;804M/s。当然也可以用重定向来导入。

/dev/zero的特点就是无限输出0,如果不加count参数的节制的话&#xff0c;输出的文件大小会一直增加&#xff0c;直到把对应的分区占满&#xff0c;不加seek是很真实的&#xff0c;上面就是产生了一个1.5G的里面全是null的文件。


案例4由于需要MYSQL数据库基础&#xff0c;这讲我们学习的重点是输入重定向&#xff0c;就跳过了&#xff0c;想看的请到

https://www.bilibili.com/video/av18740388/?p&#61;19&#xff0c;从第15分开始。

这里只是说明输入重定向还是很有用的。


用这个命令首先要yum -y install at。参考了

https://blog.csdn.net/gxiaop/article/details/55101020

需要先启动atd的。启动的方式变了&#xff0c;开机自启的命令也变了。

不是打上去的&#xff0c;是按^D自动就有的。

说起来有点奇怪&#xff0c;不知道什么时候主机名又变成localhost了。enmmmm。这个是我自己的虚拟机啊 &#xff0c;&#xff0c;原因还真不太清楚&#xff0c;不管了。

又三行的原因是回车并不是输入结束符&#xff0c;^d才是正常的输入结束符。

如果^c强制退出的话&#xff0c;只会把^c的上一行写入文件。

。可以用echo输入多行吗&#xff0c;可以&#xff0c;需要-e来解释转义字符。

但是需要引号把转义字符括起来。

还有其它转义字符比如\t&#xff0c;一个tab键也可以这么输出。

这里涉及到了脚本&#xff0c;脚本其实也好理解的&#xff0c;命令是你输一行执行一行&#xff0c;但是脚本就可以批量执行多行&#xff0c;当然执行还是一行一行来&#xff0c;但是输入只有一次&#xff0c;也不需要等一行命令执行完才可以输入下一个&#xff0c;提高了效率&#xff0c;就像在IDLE里只能一次执行一段for,但是在python脚本里面可以一次写入多个同等级的for语句&#xff0c;MATAB也是一样。脚本里面是没有人机交互的&#xff0c;那么以ctrl&#43;d作为结束符的话就不太现实&#xff0c;这时候需要用<<来定义结束符&#xff0c;上面例子已经很好的说明了这一点。

后面还会学习脚本&#xff0c;这里先见一下&#xff0c;.sh是shell脚本的后缀&#xff0c;就像python后缀是py,c&#43;&#43;后缀是cpp&#xff0c;matlab有m文件s文件。

再补充一点&#xff1a;

有的时候我们写代码需要缩进&#xff0c;对python来说更为重要。vim里怎么缩进可以参看。

https://jingyan.baidu.com/article/1612d5008ea0b8e20e1eee81.html

就是进入可视模式然后配合<或者>&#xff0c;也挺简单的。

但是<<后面定义的结束符必须顶头&#xff0c;不顶头就会报错&#xff0c;而且颜色也不是棕色的&#xff0c;那么这个时候我们可以在<<后面加-&#xff0c;这个时候结束符可以不顶头&#xff0c;但是必须是tab键&#xff0c;一般我们缩进也都是tab&#xff0c;而不是空格。

空格我试过了&#xff0c;确实不行&#xff0c;虽然eof还是棕黄色&#xff0c;但是确实会报错。

上面这个主要还是打印这个东西&#xff0c;用脚本的方式打印到终端。

有人可能会说这么麻烦有必要吗&#xff1f;当然必须要这样&#xff0c;在没有人机交互的情况下&#xff0c;计算机自动执行任务的时候必须用脚本。

综合案例4主要是为了说明多条命令输出重定向的方法。必须是小括号&#xff0c;其它的都不行。


其实这个;蛮好理解的&#xff0c;在c语言&#xff0c;MATLAB里也都是命令分隔符也就是一行可以写多个命令&#xff0c;不过c语言每段代码一个&#xff1b;是必须的&#xff0c;不然会报错,MATLAB不加&#xff1b;会直接输出&#xff0c;那样会很麻烦&#xff0c;数据多的时候你会看到命令窗口疯狂运动。

这里先补充学习一下终端的一些基本概念。参考了

https://blog.csdn.net/lcr_happy/article/details/59484514

/dev/ptmx是确实有的&#xff0c;是一个设备文件。

也就是说我们远程连接的时候用的都是伪终端。用tty可以查看当前终端&#xff0c;用w可以查看所有的终端&#xff0c;用pkill  9 -t pts/n可以终止终端&#xff0c;我们在虚拟机最小化安装的没有图形界面的里面的终端是tty&#xff0c;当然你需要登陆才行。

我是没有安装图形界面&#xff0c;如果你安装了图形界面的话可能会出现一个:0&#xff0c;这个是UI界面的终端号,gdm-sessio是UI界面。

我们了解到这里就可以了&#xff0c;我们远程连接的话都会给我们分配一个终端&#xff0c;当然可以用vnc连接图形界面的&#xff0c;我们没有UI的话就是pts/n。

匿名进程管道

进程管道其实也很简单&#xff0c;就是一个进程的输出作为另一个进程的输入&#xff0c;标准输入也就是1&#xff0c;左边进程的输出会作为右边进程的输入&#xff0c;中间的|就是一个匿名的管道。来看一下简单的效果。

如果直接ll /dev的话是很不人性化的&#xff0c;因为直接给你跳到了最后&#xff0c;后面加一个less就可以分页查看。

如果有错的话也是会显示的。


并且我们看到其实进程管道也是一种重定向&#xff0c;不过输出的方向对象不是文件而是进程的输入。

我们看到less的输入是一个管道pipe文件&#xff0c;这个文件是linux自动给你创建的。下面来看一下左边进程的文件描述符1,2会怎么样。

看到只有1重定向到了一个管道文件里面去了&#xff0c;说明和图上写的一样&#xff0c;是把标准输出也就是1重定向了&#xff0c;并且和less的fd里0对应的都是pipe22418&#xff0c;当然这种重定向也是一次性的。


上面还是一些例子&#xff0c;grep后面呢这个匹配的表达式暂时来说加不加引号没什么区别&#xff0c;不过最好加上去&#xff0c;后面会说为什么。

grep后面是可以用正则表达式的&#xff0c;^l就是以l开头的行。rpm那么命令就是查看已经装的软件包。而yum list是查看这个源里的软件&#xff0c;这些软件你不一定下载了&#xff0c;有&#64;的都是下载了的。

这里先来学习sort的用法&#xff0c;sort其实也比较简单&#xff0c;默认是一个一个字符去比较来进行排序的&#xff0c;什么意思呢&#xff1f;

看到排序的时候1后面就是11&#xff0c;这是因为先按第一个字符排的话1的ascii码没有2大。

如果想按数值排序的话就需要加一个-n。

我们回来看案例1&#xff1a;

先看一下/etc/passwd。看到以冒号分割的话&#xff0c;第三行列是uid&#xff0c;第四列是gid&#xff0c;第7列是所用的shell。

就按照上面的命令来打一下&#xff0c;上面解释的很清楚&#xff0c;还是很好理解的&#xff0c;因为/etc/passwd和多行&#xff0c;我们就用head看一下前10行。

再逆序看一下&#xff1a;

分隔符默认是空格或者tab键。


并且呢&#xff0c;sort是不会改变原来文件的内容&#xff0c;只是对文件内容排序然后输出而已。

也许你会用重定向改变源文件&#xff0c;但是不行&#xff0c;因为这样做的结果是清空了源文件&#xff0c;但是可以输出到其它文件时没有问题的。

看到对3排序的结果可以输出到4里去&#xff0c;但是sort 3>3后发现3被清空了&#xff0c;而grep命令是会报错的&#xff0c;4不能同时作为输入和输出。


案例2的这行代码我们前面也见过&#xff0c;--sort和sort命令不同&#xff0c;--sort是ps的一个选项。

当然用sort也可以完成一样的功能,--sort&#61;-%mem就是按照内存占用降序排序。head -6的原因是表头占了一行&#xff0c;不过发现用|sort的时候应该是-5&#xff0c;因为那个标题行没有了。并且其实 | 前面都可以不加空格的。

案例3用到了awk和uniq&#xff0c;awk是一个比较厉害的命令&#xff0c;不过这里用到的是很简单的功能了。参考了

https://www.cnblogs.com/xudong-bupt/p/3721210.html

字段就是分隔符之间的字符而已。

还有一个uniq&#xff0c;这个命令是去重的&#xff0c;不过必须是相邻的才行。

什么叫必须是相邻的呢&#xff1f;就是必须是相邻行才可以合并在一起的&#xff0c;那么这就得先排序一下了。

看一下效果&#xff1a;


案例5的话&#xff0c;先把有ip的行过滤出来&#xff0c;发现都有inet&#xff0c;就用这个过滤&#xff0c;但是发现inet6不是我们想要的行&#xff0c;怎么办呢&#xff0c;在匹配表达式后面加一个空格就可以。

这里就体现了引号的用处&#xff0c;如果不加引号&#xff0c;你在后面加空格也没用&#xff0c;因为根本就看不出来。

后面都是过滤ip的操作&#xff0c;后面那个/后面的数字是1的个数&#xff0c;其实就是掩码中1的个数&#xff0c;一个ip一共是有32位二进制数,最后把这个去掉就可以了。

案例6的话&#xff0c;应该看懂是不难的。

因为只需要根目录&#xff0c;所以用/$去匹配。


推荐阅读
  • 整理于2020年10月下旬:总结过去,展望未来Itistoughtodayandtomorrowwillbetougher.butthedayaftertomorrowisbeau ... [详细]
  • 本文为初学者提供了一条清晰的学习路线,帮助他们逐步成长为优秀的Web开发人员。通过十个关键步骤,涵盖从基础到高级的各个方面,确保每位学习者都能找到适合自己的学习方向。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • Linux环境下MySQL的安装与配置
    本文详细介绍了在Linux系统上安装和配置MySQL的步骤,包括安装前的准备工作、下载和解压安装包、初始化数据库、配置文件编辑、启动服务以及设置开机自启动等。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • Ubuntu 14.04 系统安装后网卡名称修改方法
    本文介绍了在安装 Ubuntu 14.04 Server 版本后,如何将默认的网卡名称从非 eth 格式修改为传统的 eth 格式,并提供了详细的步骤和示例。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • spring(22)JdbcTemplate
    2019独角兽企业重金招聘Python工程师标准###1.导入jar包,必须jar包:c3p0、mysql-connector、beans、con ... [详细]
  • mysql 授权!!
    为什么80%的码农都做不了架构师?MySQL的权限系统围绕着两个概念:认证-确定用户是否允许连接数据库服务器授权-确定用户是否拥有足够的权限执 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中安装 Python 3.7 的步骤,包括编译工具的安装、Python 3.7 源码的下载与编译、软链接的创建以及常见错误的处理方法。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • 本文详细介绍了在Mac平台上安装和配置MySQL的步骤,包括下载安装包、卸载MySQL以及解决命令行中找不到mysql命令的问题。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
author-avatar
mobiledu2502884523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有