大话Linux——管道符重定向和环境变量

简介: 3、管道符、重定向与环境变量 3.1、输入输出重定向标准输入重定向(STDIN,文件描述符为0)默认从键盘输入,还可以从其他文件或命令输入标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕

3、管道符、重定向与环境变量

3.1、输入输出重定向

  • 标准输入重定向(STDIN,文件描述符为0)默认从键盘输入,还可以从其他文件或命令输入
  • 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
  • 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕
[root@chenstudy ~]# cd /home
[root@chenstudy home]# touch linux
[root@chenstudy home]# ls -l linux 
-rw-r--r--. 1 root root 0 4月  14 19:48 linux
[root@chenstudy home]# ls -l xxxxx
ls: 无法访问xxxxx: 没有那个文件或目录
[root@chenstudy home]# 
# 在上述命令中,名为 linux 的文件是存在的,输出信息是该文件的一些相关权限、所有者、所属组、文件大小及修改时间等信息,这也是该命令的标准输出信息,而名为 xxxxxx的第二个文件是不存在的,因此在执行完 ls 命令之后显示的报错提示信息也是该命令的错误输出信息

1649937538825

  • 输入重定向中用到的符号及其作用
符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 < < 分界符 从标准输入中读入,直到遇见分界符才停止
命令 < 文件 1 > 文件 2 将文件 1 作为命令的标准输入并将标准输出到文件 2
  • 输出重定向中用到的符号及其作用
符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的 后面)

对于重定向中的标准输出模式,可以省略文件描述符 1 不写 而错误输出模式的文件描述符 2 是必须要写的

# 通过标准输出重定向将 man bash 命令原本要输出到屏幕的信息写入到文件readme.txt 中,然后显示readme.txt 文件中的内容
[root@chenstudy home]# man bash > readme.txt
[root@chenstudy home]# cat readme.txt 
 -c string 如果有 -c 选项,那么命令将从 string 中读取。如果 string 后面有参数 (argument),它们将用于给位置参数 (positional parameter,以 $0 起始) 赋值。
       -i        如果有 -i 选项,shell 将交互地执行 ( interactive )。
       -l        选项使得 bash 以类似登录 shell (login shell) 的方式启动 (参见下面的 启
       -r        如果有 -r 选项,shell 成为受限的 ( restricted ) (参见下面的 受
       -s        如果有 -s 选项,或者如果选项处理完以后,没有参数剩余,那么命令将从标准输入读取。 这个选项允许在启动一个交互 shell 时可以设置位置参数。
       -D        向标准输出打印一个以 $ 为前导的,以双引号引用的字符串列表。 这是在当前语言环境不是 C 或 POSIX 时,脚本中需要翻译的字符串。 这个选项隐含了 -n 选项;不会执行命令。
       [-+]O [shopt_option]
                 shopt_option  是一个  shopt  内建命令可接受的选项  (参见下面的  shell  内
                 取消它。 如果没有给出 shopt_option,shopt 将在标准输出上打印设为允许的选项的名称和值。 如果启动选项是 +O,输出将以一种可以重用为输入的格式显示。
       --        -- 标志选项的结束,禁止其余的选项处理。任何 -- 之后的参数将作为文件名和参数对待。参数 - 与此等价。

       Bash 也解释一些多字节的选项。在命令行中,这些选项必须置于需要被识别的单字符参数之前。

       --dump-po-strings
              等价于 -D,但是输出是 GNU gettext po (可移植对象) 文件格式
       --dump-strings
              等价于 -D
       --help 在标准输出显示用法信息并成功退出
       --init-file file

1649937655308

重写readme.txt文件,并写入:Wlecome to XYNU,然后再追加Hello 22

[root@chenstudy home]# echo "Wlecome to XYNU" > readme.txt 
[root@chenstudy home]# echo "Hello 22" >> readme.txt 
[root@chenstudy home]# cat readme.txt 
Wlecome to XYNU
Hello 22

1649937894551

对于输处重定向技术,不同命令的标准输出和错误输出还是有区别的

对于真实存在的文件,使用标准输出即将原本输出到屏幕的信息写入到文件中,而错误的输出重定向则依然把信息输出到屏幕上

[root@chenstudy home]# ls -l linux 
-rw-r--r--. 1 root root 0 4月  14 19:48 linux
[root@chenstudy home]# ls -l linux > /root/stderr.txt
[root@chenstudy home]# ls -l linux 2> /root/stderr.txt
-rw-r--r--. 1 root root 0 4月  14 19:48 linux
[root@chenstudy home]# 

1649938475797如何把错误信息写入到文件中呢?

[root@chenstudy home]# ls -l xxxx
ls: 无法访问xxxx: 没有那个文件或目录
[root@chenstudy home]# ls -l xxxx > /root/stderr.txt
ls: 无法访问xxxx: 没有那个文件或目录
[root@chenstudy home]# ls -l xxxx 2> /root/stderr.txt
[root@chenstudy home]# cat /root/stderr.txt 
ls: 无法访问xxxx: 没有那个文件或目录
[root@chenstudy home]# 

1649938640969

3.2、 管道命令符

执行格式为“命令 A | 命令 B”

# 找出被限制登录用户的命令是 grep "/sbin/nologin" /etc/passwd;
# 统计文本行数的命令则是 wc -l
[root@chenstudy home]# grep "/sbin/nologin" /etc/passwd | wc -l
39
[root@chenstudy home]# 

# 查看/etc 目录中的文件列表及属性信息
[root@chenstudy home]# ls -l /etc/ | more

1649939353633

在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成 第3章 管道符、重定向与环境变量 64 为一个非常致命的缺陷。通过把管道符和 passwd 命令的--stdin 参数相结合,我们可以用一条 命令来完成密码重置操作:

[root@chenstudy home]# echo "root" | passwd --stdin root
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@chenstudy home]# 

管道符命令可以组合使用多个命令A | 命令B | 命令C

3.3、命令行统配符

我们有时候也会遇到明明一 个文件的名称就在嘴边但就是想不起来的情况批量查看所有硬 盘文件的相关权限属性,一种方式是这样的:

[root@chenstudy home]# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 4月  14 19:40 /dev/sda
[root@chenstudy home]# ls -l /dev/sda1
brw-rw----. 1 root disk 8, 1 4月  14 19:40 /dev/sda1
#通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配 0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配 a、b、c 三个字符中的任意一个字符
# 比如星号(*)代表匹配零个或多个字符
[root@chenstudy home]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 4月  14 19:40 /dev/sda
brw-rw----. 1 root disk 8, 1 4月  14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 2 4月  14 19:40 /dev/sda2
brw-rw----. 1 root disk 8, 3 4月  14 19:40 /dev/sda3
# 只想查看文件名为 sda 开头,但是后面还紧跟其他某一个字符的文件的相关信息就需要用到问号来进行通配了
[root@chenstudy home]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 4月  14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 2 4月  14 19:40 /dev/sda2
brw-rw----. 1 root disk 8, 3 4月  14 19:40 /dev/sda3
# 匹配任意的数字0-9
[root@chenstudy home]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 4月  14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 2 4月  14 19:40 /dev/sda2
brw-rw----. 1 root disk 8, 3 4月  14 19:40 /dev/sda3
[root@chenstudy home]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 4月  14 19:40 /dev/sda1
brw-rw----. 1 root disk 8, 3 4月  14 19:40 /dev/sda3

1649943113029

### 3.4、 常用的转义字符

常用的转义字符:为了能够更好地理解用户的表达,Shell 解释器还提供了特别丰富的转义字符来处理输入 的特殊数据

  • 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
  • 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
  • 双引号(""):保留其中的变量属性,不进行转义处理
  • 反引号(``):把其中的命令执行后返回结果
#先定义一个名为 PRICE 的变量并赋值为 5,然后输出以双引号括起来的字符串与变量信息:
[root@chenstudy ~]# PRICE=5
[root@chenstudy ~]# echo "PRICE IS $PRICE"
PRICE IS 5
# 输出“Price is $5”
[root@chenstudy ~]# echo "PRICE IS \$$PRICE"
PRICE IS $5
# 反引号与 uname -a 命令结合,然后使用 echo 命令来查看本机的 Linux版本和内核信息:
[root@chenstudy ~]# echo `uname -a` 
Linux chenstudy 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

3.5、重要的环境变量

  • 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话 则直接执行
  • Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令 名称来替换原本的命令名称

    • 用 alias 命令来创建一个属于自己的命令别名,格式为 “alias 别名=命令”
    • 要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”
[root@chenstudy ~]# ls
anaconda-ks.cfg  ch  initial-setup-ks.cfg  stderr.txt  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@chenstudy ~]# rm anaconda-ks.cfg 
rm:是否删除普通文件 "anaconda-ks.cfg"?y
[root@chenstudy ~]# alias rm 
alias rm='rm -i'
[root@chenstudy ~]# unalias rm
[root@chenstudy ~]# rm initial-setup-ks.cfg 
[root@chenstudy ~]# 

1649947461019

  • Bash 解释器判断用户输入的是内部命令还是外部命令 ,可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令
  • 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH,可 以简单地把它理解是“解释器的小助手”,作用是告诉 Bash 解释器待执行的命令可能存放 的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找
[root@chenstudy ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@chenstudy ~]# PATH=$PATH:/root/bin
[root@chenstudy ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
[root@chenstudy ~]#

1649947650572

  • Linux 系统中最重要的 10 个环境变量
变量名称 作用
HOME 用户的主目录(即家目录)
SHELL 用户在使用的Shell解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
PS1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器
[root@chenstudy ~]# echo $HOME
/root
[root@chenstudy ~]# su - chen
上一次登录:二 4月 12 22:16:24 CST 2022:0 上
[chen@chenstudy ~]$ echo $HOME
/home/chen
# 变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建变量,来满足工作需求
[root@chenstudy ~]# mkdir /home/workdir
[root@chenstudy ~]# WORKDIR=/home/workdir
[root@chenstudy ~]# cd $WORKDIR
[root@chenstudy workdir]# pwd
/home/workdir
[root@chenstudy workdir]# 
# 上述方式的变量不具有全局性,工作需要时可以使用export命令将其提升为全局变量
[root@chenstudy workdir]# su - chen
上一次登录:四 4月 14 23:02:17 CST 2022pts/2 上
[chen@chenstudy ~]$ cd $WORKDIR
[chen@chenstudy ~]$ echo $WORKDIR
[chen@chenstudy ~]$ exit
登出
[root@chenstudy workdir]# su - root
上一次登录:四 4月 14 23:03:02 CST 2022pts/2 上
[root@chenstudy ~]# export WORKDIR
[root@chenstudy ~]# cd /home/workdir/
[root@chenstudy workdir]# su - chen
上一次登录:四 4月 14 23:06:08 CST 2022pts/2 上
目录
相关文章
|
3月前
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
137 3
|
3月前
|
存储 Unix Linux
Linux I/O 重定向与管道
【8月更文挑战第17天】重定向在Linux中改变命令I/O流向,默认有&quot;&gt;&quot;覆盖输出至文件及&quot;&gt;&gt;&quot;追加输出至文件末尾,便于保存结果;使用&quot;&lt;&quot;从文件读取输入而非键盘,高效处理数据。文件描述符如0(stdin)、1(stdout)、2(stderr)标识I/O资源,支持读写操作。管道以&quot;|&quot;连接命令,使前一命令输出成为后一命令输入,如排序用户或找出CPU占用最高的进程,构建复杂数据处理流程。
47 9
|
3月前
|
存储 Linux 数据处理
在Linux中,什么是管道操作,以及如何使用它?
在Linux中,什么是管道操作,以及如何使用它?
|
3月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
66 0
|
3月前
|
消息中间件 Linux
Linux0.11 管道(十一)
Linux0.11 管道(十一)
25 0
|
3月前
|
Linux Shell
在Linux中,如何设置环境变量?
在Linux中,如何设置环境变量?
|
3月前
|
数据挖掘 Linux 应用服务中间件
在Linux中,如何在Linux中使用管道?
在Linux中,如何在Linux中使用管道?
|
3月前
|
Shell Linux
在Linux中,什么是环境变量?如何设置和查看环境变量?
在Linux中,什么是环境变量?如何设置和查看环境变量?
|
3月前
|
存储 Linux 数据处理
在Linux中,管道(pipe)和重定向(redirection)的是什么?
在Linux中,管道(pipe)和重定向(redirection)的是什么?
|
3月前
|
存储 Unix Linux
在Linux中,什么是管道?它是如何工作的?
在Linux中,什么是管道?它是如何工作的?