卷毛崽|Linux自学|管道符、重定向与环境变量

输入输出重定向

简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。

标准输入重定向( STDIN,文件描述符为 0):默认从键盘输入,也可从其他文件或命令中输入。
标准输出重定向( STDOUT,文件描述符为 1):默认输出到屏幕。
错误输出重定向( STDERR,文件描述符为 2):默认输出到屏幕。
例如:

[root@xiaojuanmao ~]# ll /root/findfiles/222
-rw-r--r--. 1 natasha root 0 Apr 27 05:12 /root/findfiles/222
[root@xiaojuanmao ~]# ll /root/findfiles/XXXXX
ls: cannot access /root/findfiles/XXXXX: No such file or directory

在这里插入图片描述
对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符 2是必须要写的。
例如:
标准输出重定向将 man bash命令原本要输出到屏幕的信息写入到文件 readme.txt中,然后显示 readme.txt文件中的内容。具体命令如下:

[root@xiaojuanmao ~]# man bash > readme.txt
[root@xiaojuanmao ~]# cat readme.txt
BASH(1)                     General Commands Manual                     BASH(1)



NAME
       bash - GNU Bourne-Again SHell


..........省略..............

再体会一下有没有感觉到很方便呢?我们接下来尝试输出重定向技术中的覆盖写入与追加写入

[root@xiaojuanmao ~]# echo "覆盖写入" > readme.txt
[root@xiaojuanmao ~]# echo "追加写入" >> readme.txt
[root@xiaojuanmao ~]# cat readme.txt
覆盖写入
追加写入

如果想把命令的报错信息写入到文件,该怎么操作呢?
当用户在执行一个自动化的Shell脚本时,这个操作会特别有用,而且特别实用,因为它可以把整个脚本执行过程中的报错信息都记录到文件中,便于安装后的排错工作。接下来我们以一个不存在的文件进行实验演示:

[root@xiaojuanmao ~]# ls -l xxxxx
ls: cannot access xxxxx: No such file or directory
[root@xiaojuanmao ~]# ls -l  xxxxx > error.txt
ls: cannot access xxxxx: No such file or directory
[root@xiaojuanmao ~]# ls -l  xxxxx 2> error.txt
[root@xiaojuanmao ~]# cat error.txt
ls: cannot access xxxxx: No such file or directory

输入重定向相对来说有些冷门,是把文件直接导入到命令中。接下来使用输入重定向把 readme.txt文件导入给 wc -l命令,统计一下文件行数

[root@xiaojuanmao ~]# wc -l < readme.txt
2

管道命令符(|)

执行格式为==“命令 A | 命令 B”。 管道 命令符的作用指“把前一个命令原本要输出到屏幕的 标准正常 数据当作是后一个命令的标准输入==”
常见操作:
在修改用户密码时,通常都需要输入两次密码以进行确认,通过把管道符和passwd命令的命令的–stdin参数相结合,可以用一条命令来完命令来完成密码重置操作

[root@xiaojuanmao ~]# echo "123456" | passwd --stdin natasha
Changing password for user natasha.
passwd: all authentication tokens updated successfully.

下面这条命令就结合使用了mail邮件命令与输入重定向的分界符,其目的是让用户一直输入内容,直到用户输入了其自定义的分界符时,才结束输入。

[root@xiaojuanmao] mail -s " root@xiaojuanmao.com << over
> I think linux is very practical
> I hope to learn more
> can you teach me
> over

命令行的通配符(* ? )

通配符就是通用的匹配信息的符号
比如星号==*代表匹配零个或多个字符==

[root@xiaojuanmao ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 Apr 26 04:19 /dev/sda
brw-rw----. 1 root disk 8, 1 Apr 26 04:19 /dev/sda1
brw-rw----. 1 root disk 8, 2 Apr 26 04:19 /dev/sda2


问号==?代表匹配单个字符==

[root@xiaojuanmao ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 Apr 26 04:19 /dev/sda1
brw-rw----. 1 root disk 8, 2 Apr 26 04:19 /dev/sda2

中括号内加上数字== [0-9]代表匹配 0-9之间的单个数字==的字符
除了使用[0-9]来匹配 0~9之间的单个数字 ,也可以用 [135]这样的方 式仅匹配这三个指定数字中的一个,若没有匹配到,则不会显示出来:

[root@xiaojuanmao ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 Apr 26 04:19 /dev/sda1
brw-rw----. 1 root disk 8, 2 Apr 26 04:19 /dev/sda2
[root@xiaojuanmao ~]# ls -l /dev/sda[13]
brw-rw----. 1 root disk 8, 1 Apr 26 04:19 /dev/sda1

而中括号内加 上字母 [abc]则是代表匹配 a、 b、 c三个字符中的任意一个字符

常用的转义字符(\ , ’ ', “ ”, ``)

4个最常用的转义字符

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
单引号(’’):转义其中所有的变量为单纯的字符串。
双引号(""):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的==命令执行后返回结果。

我们先定义一个名为
PRICE的变量并赋值为 5,然后输出以双引号括起来的字符串与变量信息:

[root@xiaojuanmao ~]# price=5
[root@xiaojuanmao ~]# echo "Price is $price"
Price is 5

接下来,我们希望能够输出“Price is $5”,即价格是 5美元的字符串内容,但碰巧美元符号与变量 提取符号合并后的 $$作用是显示当前程序的进程 ID号码,于是命令执行后输出的内容并不是我们所预期的:

[root@xiaojuanmao ~]# echo "Price is $$price"
Price is 2502price

要想让第一个““$”乖乖地作为美元符号,那么就需要使用反斜杠 (\)来进行转义,将这个命令提取符转义成单纯的文本,去除其特殊功能。

[root@xiaojuanmao ~]# echo "Price is \$$price"
Price is $5

而如果只需要某个命令的输出值时,可以像xx这样,将命令用反引号括起来,达到预期的效果。例如,将反引号与 uname -a命令结合,然后使用 echo命令来查看本机的 Linux版本和内核信息:

[root@xiaojuanmao ~]# echo `uname -a`
Linux xiaojuanmao 3.10.0-514.el7.x86_64 #1 SMP Wed Oct 19 11:24:13 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux

重要的环境变量及自定义变量

系统在多个路径中查找用户输入的命令文件,而定义这些路径 的变量叫作 PATH
以简单地把它理解成是“解释器的小助手”,作用是告诉 Bash解释器待执行的命令可能存放的位置,然后 Bash解释器就会乖乖地在这些位置中逐个查找。 PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到 Bash解释器对Linux命令的查找。

[root@xiaojuanmao ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaojuanmao ~]# path=$PATH:/root/sbin
[root@xiaojuanmao ~]# echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/sbin

在这里插入图片描述
Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。例如查看 HOME变量在不同用户身份下都有哪些值

[root@xiaojuanmao ~]# echo $HOME
/root
[root@xiaojuanmao ~]# su natasha
[natasha@xiaojuanmao root]$ echo $HOME
/home/natasha


其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们可以自定义变量

[root@xiaojuanmao ~]# mkdir /home/testpath
[root@xiaojuanmao ~]# WORKDOR=/home/testpath
[root@xiaojuanmao ~]# cd $WORKDOR
[root@xiaojuanmao testpath]# pwd
/home/testpath

但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。可以用export提升为全局变量

[root@xiaojuanmao ~]# export WORKDOR
[root@xiaojuanmao ~]# su natasha
[natasha@xiaojuanmao ~]$ cd $WORKDOR
[natasha@xiaojuanmao testpath]$ pwd
/home/testpath

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值