Linux学习Day4:管道符、重定向与环境变量
仅仅是学习Linux系统的命令还不够,只有把多个命令按照自己想要的方式进行组合使用,才能提高工作效率。今天的内容主要是关于如何把命令组合在一起使用,使得输入的命令更准确、更高效,也为接下来的Shell脚本打好基础。
一、输入输出重定向
输入重定向:指把文件内容导入到命令中。
输出重定向:指把原本要输出到屏幕的数据信息写入到指定的文件中,又分为标准输出重定向和错误输出重定向两种。
- 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令输入。
- 标准输出重定向(STDIN,文件描述符为1):默认输出到屏幕。
- 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
要区别对待两种输出信息,第一种是命令的标准输出信息,第二种是命令的报错提示信息(错误输出),如下所示:
- [root@linuxprobe ~]# ls -l anaconda-ks.cfg
- -rw-------. root root Feb anaconda-ks.cfg //ls命令的标准输出信息,也是我们想要的信息
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# ls -l xxxxx
- ls: cannot access xxxxx: No such file or directory //因为xxxxx文件不存在,所以输出的是报错提示信息
- [root@linuxprobe ~]#
对于输入重定向来说,用到的符号及其作用如下所示:
符号 | 作用 |
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止(分界符可以自己定义,如"EOF"、"over"等) |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
对于输出重定向来说,用到的符号及其作用如下所示:
符号 | 作用 |
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原来文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有文件的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出和错误输出共同写入到文件中(追加到原有内容的后面) |
通过标准输出重定向将 man ls 命令原本要输出到屏幕的信息写入文件readme.txt中,然后显示readme.txt文件中的内容,具体命令如下:
- [root@linuxprobe ~]# man ls > readme.txt
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# cat readme.txt
- LS() User Commands LS()
- NAME
- ls - list directory contents
- SYNOPSIS
- ls [OPTION]... [FILE]...
- DESCRIPTION
- List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor
- --sort is specified.
- ---------------------------------省略部分输出内容---------------------
通过覆盖写入模式向readme.txt文件中写入一行数据,然后再通过追加写入模式再写入一行数据,具体命令如下:
- [root@linuxprobe ~]# echo "Welcome to my home" > readme.txt //清除原有的内容
- [root@linuxprobe ~]# echo "Learning Linux is happy to me" >> readme.txt //追加至原来文件内容的后面
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# cat readme.txt
- Welcome to my home
- Learning Linux is happy to me
- [root@linuxprobe ~]#
如果想把命令的报错信息写入文件,该如何操作呢?
- [root@linuxprobe ~]# ls -l xxxxx
- ls: cannot access xxxxx: No such file or directory //提示xxxxx文件不存在
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# ls -l xxxxx > readme.txt //将报错信息写入readme.txt文件
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# cat readme.txt
- ls: cannot access xxxxx: No such file or directory //报错信息写入readme.txt文件成功
- [root@linuxprobe ~]#
输入重定向相对来说比较冷门,在工作中遇到的概率较小。输入重定向的作用是把文件内容直接导入命令中。接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计文件内容的行数。
- [root@linuxprobe ~]# cat readme.txt
- ls: cannot access xxxxx: No such file or directory
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# wc -l < readme.txt //使用输入重定向
- [root@linuxprobe ~]#
二、管道命令符
管道符,即“|”,其执行的格式“命令A | 命令B”,当然可以这样使用:“命令A | 命令B | 命令C”。管道命令符的作用是把前一个命令A原本要输出到屏幕的标准正常数据当作是后一个命令B的标准输入,比如把搜索命令的输出值传递给统计命令,具体如下:
- [root@localhost ~]# grep "/sbin/nologin" /etc/passwd | wc -l
- [root@localhost ~]#
再比如用翻页的形式查看/etc目录中的文件列表及属性信息:
- [root@localhost ~]# ls -l /etc/ | more
- total
- -rw-r--r--. root root Jun adjtime
- -rw-r--r--. root root Jun aliases
- -rw-r--r--. root root Jun aliases.db
- drwxr-xr-x. root root Jun alternatives
- -rw-------. root root Mar anacrontab
- -rw-r--r--. root root Nov asound.conf
- -rw-r--r--. root root Oct at.deny
- drwxr-x---. root root Jun audisp
- drwxr-x---. root root Jun audit
- drwxr-xr-x. root root Jun bash_completion.d
- -rw-r--r--. root root Nov bashrc
- drwxr-xr-x. root root Nov binfmt.d
- -rw-r--r--. root root Nov centos-release
- --More--
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过管道符和passwd命令的--stdin参数相结合,可以用一条命令来完成密码重置的操作:
- [root@localhost ~]# echo "" | passwd --stdin root //一条命令修改root用户密码
- Changing password for user root.
- passwd: all authentication tokens updated successfully.
- [root@localhost ~]#
通过重定向技术能够一次性地把多行信息打包输入或输出,比如让用户一直输入内容,直到用户输入了其自定义的分界符时,才结束输入。这种方法在编写自动化脚本时经常用到。
- [root@localhost ~]# mail -s "readme" root@localhost << over //"over"为用户自定义地分界符
- > i think linux is very practical
- > i hope to learn more
- > can you teach me?
- > over //遇到分界符后结束输入,以上3行信息则为用户输入的有效内容
- [root@localhost ~]#
三、命令行的通配符
通配符,顾名思义,就是通用的匹配信息的符号,常见的通配符如下所示:
- 星号(*)代表匹配零个或多个字符;
- 问号(?)代表匹配单个字符;
- 中括号内加上数字([0-9])代表匹配0~9之间的单个数字的字符;
- 中括号内加上字母([abc])则代表匹配a、b、c三个字中的任意一个字符。
匹配在/dev目录中所有以sda开头的文件:
- [root@localhost ~]# ls -l /dev/sda*
- brw-rw----. root disk , Feb : /dev/sda
- brw-rw----. root disk , Feb : /dev/sda1
- brw-rw----. root disk , Feb : /dev/sda2
- [root@localhost ~]#
匹配以sda开头,且后面还紧跟某一个字符(字符包括字母、数字、特殊符号等等)的文件:
- [root@localhost ~]# ls -l /dev/sda? //该命令排除了/dev/sda文件,因为不匹配空值
- -rw-r--r--. root root Feb : /dev/sda@ //该文件为本人所创建,用来实验测试
- brw-rw----. root disk , Feb : /dev/sda1
- brw-rw----. root disk , Feb : /dev/sda2
- [root@localhost ~]#
匹配以sda开头,且后面还紧跟某一个数字的文件:
- [root@localhost ~]# ls -l /dev/sda[-]
- brw-rw----. root disk , Feb : /dev/sda1
- brw-rw----. root disk , Feb : /dev/sda2
- [root@localhost ~]#
匹配以sda开头,且后面还紧跟1、3、5中的某一个数字的文件:
- [root@localhost ~]# ls -l /dev/sda[] //最好写成[1,3,5],因为这种写法更规范
- brw-rw----. root disk , Feb : /dev/sda1
- [root@localhost ~]#
四、常用的转义字符
Shell解释器提供了丰富的转义字符来处理输入的特殊数据,常见的4个转义字符如下所示:
- 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串;
- 单引号(''):转义其中所有的变量为单纯的字符串;
- 双引号(""):保留其中的变量属性,不进行转义处理;
- 反引号(``):把其中的命令执行后返回结果。
实验:先定义一个名为PRICE的变量并赋值5,然后输出以双引号括起来的字符串与变量信息:
- [root@localhost ~]# PRICE=
- [root@localhost ~]#
- [root@localhost ~]# echo "Price is $PRICE" //保留其中变量属性
- Price is 5
实验:想要输出“Price is $5”,需要使用反斜杠进行转义。
- [root@localhost ~]# echo "Price is $$PRICE" //$$的作用是显示当前程序的进程ID号码
- Price is 2571PRICE
- [root@localhost ~]#
- [root@localhost ~]# echo "Price is \$$PRICE" //使用反斜杠进行转义
- Price is $
- [root@localhost ~]#
实验:输出命令执行的结果。
- [root@localhost ~]# echo `uname -a` //先执行uname -a命令,然后输出执行结果
- Linux localhost.localdomain 3.10.-.el7.x86_64 # SMP Tue Nov :: UTC x86_64 x86_64 x86_64 GNU/Linux
- [root@localhost ~]#
五、重要的环境变量
变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都用大写表示,这是一种约定俗成的规范。可以直接通过变量名称来提取对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户的家目录、邮件存放的位置等。
在执行了一条命令后,Linux系统中到底发生了什么呢?简单来说,主要分为4个步骤:
第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls就是以绝对路径的方式执行命令),如果是的话则直接执行。
第2步:Linux系统检查用户输入的命令是否为“别名命名”,即用一个自定义的命令名称来替换原本的命令名称。alias命令可以用来创建属于自己的命令别名,格式为“alias 别名=命令”。unalias命令用来取消命令别名,格式为“unalias 别名”。在上图中,输入ls命令后,不同的文件类型显示不同的颜色,这其实就是Linux系统为了方便用户区分文件类型而特意设置的ls命令别名。
- [root@localhost ~]# alias ls='ls --color=auto' //设置命令的别名,执行ls命令则等同于执行ls --cloar=auto
- [root@localhost ~]#
第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的命令,会被直接执行。而用户在绝大多数输入的是外部命令,这些外部命令交由第4步处理。可以用“tyep 命令名称”来判断输入的命令是内部命令还是外部命令,能定位到命令存放的路径的都是外部命令。
- [root@linuxprobe ~]# type cat
- cat is /usr/bin/cat
- [root@linuxprobe ~]# type more
- more is /usr/bin/more
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,作用是告诉Bash解释器将要执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些路径下逐个查找。PATH变量包含多个路径值,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
- [root@linuxprobe ~]# echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# PATH=$PATH:/root/bin //添加新的路径,不过系统重启后失效
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin //添加成功
- [root@linuxprobe ~]#
综上所述,作为一名态度谨慎的运维工作者来说,在接手一台新的Linux系统后一定要检查PATH变量中是否有可疑的目录。另外,可以使用env命令来查看Linux系统中所有的环境变量,其中最重要的10个环境变量如下所示:
变量名称 | 作用 |
HOME | 用户的主目录(即家目录) |
SHELL | 用户当前使用的SHELL解释器的名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称(出现乱码后,首先检查该变量) |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。
- [root@linuxprobe ~]# echo $HOME
- /root
- [root@linuxprobe ~]# su - linuxprobe //切换至linuxprobe用户
- Last login: Sat Feb :: BNT on :
- [linuxprobe@linuxprobe ~]$
- [linuxprobe@linuxprobe ~]$ echo $HOME
- /home/linuxprobe
- [linuxprobe@linuxprobe ~]$
我们完全可以自行创建一个变量,来满足工作需求。例如设置一个名为WORKDIR的变量,如下所示:
- [root@linuxprobe ~]# mkdir /home/workdir //新建一个目录
- [root@linuxprobe ~]#
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# WORKDIR=/home/workdir //新建一个变量,并将路径赋值给WORKDIR变量
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# cd $WORKDIR
- [root@linuxprobe workdir]# pwd
- /home/workdir
- [root@linuxprobe workdir]#
这样的变量不具有全局性,作用范围有限,可以使用export命令将其提升为全局变量,这样其他用户就可以使用了。注意:当使用su - 命令切换用户时,export命令无效
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# WORKDIR=/home/workdir/ //给WORKDIR变量赋值
- [root@linuxprobe ~]# echo $WORKDIR
- /home/workdir/
- [root@linuxprobe ~]# export WORKDIR //提升为全局变量
- [root@linuxprobe ~]#
- [root@linuxprobe ~]# su linuxprobe //切换至linuxprobe用户
- [linuxprobe@linuxprobe root]$
- [linuxprobe@linuxprobe root]$ echo $WORKDIR //成功输出WORKDIR变量的值
- /home/workdir/
- [linuxprobe@linuxprobe root]$ su - linuxprobe //使用su -命令切换至linuxprobe用户
- Password:
- Last login: Sat Feb :: BNT on pts/
- [linuxprobe@linuxprobe ~]$ echo $WORKDIR //无法查看WORKDIR变量的值
- [linuxprobe@linuxprobe ~]$
Linux学习Day4:管道符、重定向与环境变量的更多相关文章
- Linux学习--第十一天--source、环境变量目录、欢迎信息、正则、cut、awk、sed、sort、判断表达式、if、for、case、一些脚本
source source /root/.bashrc #让修改后的配置文件在不重启系统的情况下生效.source等同于. 环境变量目录 /etc/profile /etc/profile.d/*.s ...
- Linux学习之管道符、重定向、通配符、转义符、环境变量
Linux学习之管道符.重定向.通配符.转义符.环境变量 1. 输入输出重定向 输入重定向是指把文件导入命令中. 输出重定向是指把原本要输出到屏幕的数据信息写入指定文件中. a 标准输入重定向(STD ...
- 《Linux就该这么学》培训笔记_ch03_管道符、重定向与环境变量
<Linux就该这么学>培训笔记_ch03_管道符.重定向与环境变量 文章最后会post上书本的笔记照片. 文章主要内容: 输入输出重定向 管道命令符 命令行的通配符 常用的转义字符 重要 ...
- Linux学习之CentOS(一)--CentOS6.4环境搭建
Linux学习之CentOS(一)--CentOS6.4环境搭建http://www.cnblogs.com/xiaoluo501395377/archive/2013/03/31/CentOs.ht ...
- 【linux草鞋应用编程系列】_2_ 环境变量和进程控制
一. 环境变量 应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作. 在linux中有两种方法获取环境变量,分述如下. 1.通过main函数的参数获取环境变量 ...
- Linux下Jdk的安装和jdk环境变量的设置
我们在Linux下安装系统软件的时候,经常遇到一些系统环境变量配置的问题.什么是环境变量?如何定制环境变量?我将在下面做一些介绍.一.什么是环境变量?Linux是一个多用户的操作系统.多用户意味着每个 ...
- Linux上安装jdk1.8和配置环境变量
前言 Linux 上安装jdk1.8 和配置环境变量,参考相关文档,本人在此总结,操作归纳如下. 第一步:创建jdk安装目录(该/usr/local/src 目录是空的,最好把我们自己下载的放到这,容 ...
- Linux—export命令查看、修改用户环境变量
Linux export 命令用于设置或显示环境变量. 在 shell 中执行程序时,shell 会提供一组环境变量. export 可新增,修改或删除环境变量,供后续执行的程序使用. export ...
- Linux就该这么学(3)-管道符、重定向与环境变量(学习笔记)
1.Linux命令与文件读写操作有关的重定向技术: 学习目标:主要解决输出信息的保存问题. 标准覆盖输出重定向: 标准追加输出重定向 错误覆盖输出重定向 错误追加输出重定向 输入重定向 标准输入(ST ...
随机推荐
- 通过示例学习rholang(上部:课程0-6)
通过例子和实践来学习rho语言.下面的例子和练习都很值得去运行.阅读.修改和完善.修改练习和教程中任何你感到有意思的代码,这样能够获得最好的学习效果.该教程包含了rho语言最常见以及最重要的特性,足以 ...
- linux 为动态分配的Virtualbox虚拟硬盘扩容
如何为动态分配的Virtualbox虚拟硬盘扩容 查看虚拟硬盘是否是动态分配大小 打开虚拟机的设置界面,在左侧栏点击存储.在存储树下面选择你的虚拟硬盘.在右边可以看见虚拟硬盘的信息.在下面可以看见,我 ...
- 使用C++进行声明式编程
声明式编程(英语:Declarative programming)是一种编程范型,与命令式编程相对立.它描述目目标性质,让计算机明白目标,而非流程.声明式编程不用告诉电脑问题领域,从而 ...
- UML--->用例图梳理
用例图梳理 概述 用例图主要用来描述"用户.需求.系统功能单元"之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. 用例图的主要目的是帮助开发团队以一种可视化的方式理解系 ...
- selenium8中元素定位方式
Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制,我在这里将对各种元素定位方式进行总结归纳一下. 这里将统一使用百度 ...
- 通过域名直接访问Linux服务器中的项目
参考:https://blog.csdn.net/m0_37802616/article/details/87623077 https://blog.csdn.net/u013176571/artic ...
- nginx的四个主要组成部分
1.nginx二进制可执行文件 · 由各模块源码编译出的一个文件 2.nginx.conf配置文件 · 控制nginx的行为 3.access.log访问日志 . 记录每一条http请求信息 4.er ...
- 从Libra看区块链的机遇
一番码客 : 挖掘你关心的亮点.http://www.efonmark.com 关于未来的思考 记得去年扎克伯格搞Libra的时候,引起了世界的关注.但随着美国国会听证会的阻力,渐渐很少听见Libra ...
- ubuntu 14.04 如何设置静态ip
有线网络: 1. 找到文件并作如下修改: sudo vim /etc/network/interfaces 修改如下部分: auto eth0iface eth0 inet staticaddress ...
- Codeforces_801
A.直接暴力就行了,先把能组合的按线性组合掉,再枚举剩下相邻没用过的. #include<bits/stdc++.h> using namespace std; string s; ] = ...