Linux常见命令 9 - 引号和重定向

1. 引号

(1) 单引号

在Linux中,单引号是所见即所得,单引号里面的所有内容都会原样输出,不会有任何解析。如执行touch '[a-z]'.txt, 则会生成 [a-z].txt

(2) 双引号

在Linux中,双引号是一种弱引用,能够识别各种特殊符号,变量以及转义字符等,可以解析后再输出结果。

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# echo "hello world"
hello world
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# echo "$(date)"
Tue Jun 21 17:26:36 CST 2022

(3) 无引号

再Linux中,一般情况下,比如连续的字符,路径等可以省略双引号,但若遇见空格,特殊字符等必须要加上双引号

(4) 反引号

反引号常用于命令结果,等同于$(), 先解析出来结果,再用双引号来展示。直接用双引号不能对表达式进行理解。

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# touch "`date`".txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# touch "`date +%T`".txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# touch "`date +%F`".txt

===================与下列命令等价=====================

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# touch "$(date)".txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# touch "$(date +%T)".txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# touch "$(date +%F)".txt

 2. 重定向

(1) 基本知识

        在Linux中,一切设备都看作文件,每打开一个文件,就有一个代表打开文件的文件描述符。

        程序启动时默认打开三个I/O设备文件:

         - 标准输入文件stdin,文件描述符0

         - 标准输出文件stdout,文件描述符1

         - 标准错误输出文件stderr,文件描述符2

(2) 重定向符号

标准输入重定向0< 或 < 
追加输入重定向0<< 或 <<
标准输出重定向1> 或 >默认覆盖
标准输出追加重定向1>> 或 >>追加
标准错误输出重定向2> 默认覆盖
标准错误追加输出重定向2>>追加

(3) 特殊重定向 2>&1

        2>&1的含义? 把标准错误重定向到标准输出。为 command > a.txt 2>&1

        2>1和2>&1的区别 ?

        2>1的作用是把标准错误的输出重定向到1,但这个1不是标准输出,而是文件名为1的文件 。2>&1的作用是把标准错误的输出重定向到标准输出1,&指示不要把1当作普通文件,而是要当作标准输出来处理。

        cmd >a 2>a 与 cmd>a 2>&1的区别 ?

        这两条命令均为cmd的标准输入重定向到文件 a 中,标准错误也重定向到文件 a 中。但cmd>a 2>a是打开a文件两次,即互相竞争使用文件a的管道,导致标准错误输出和标准输出相互覆盖。而cmd>a 2>&1只打开一次,不会出现覆盖。为什么后者是只打开一次呢?通过cmd得到stdout之后,直接送往文件a ,stderr是继承了前面的管道FD1,再被送往文件a,所以a文件只被打开一遍,就是FD1将其打开。

        为什么 2>&1要放在cmd后面?

        cmd > file 2>&1 :首先是cmd > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。 
       command 2>&1 >file :2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

(4) 示例:

标准输出重定向 > ,会覆盖

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# echo "hello world" > test.txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# echo "hello world" > test.txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# cat ./test.txt
hello world

标准追加输出重定向 >>,不会覆盖

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# echo "hello world" >> test1.txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# echo "hello world" >> test1.txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# cat ./test1.txt                
hello world
hello world

输入重定向 < ,将txt信息,输入给cat,让结果显示在终端

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# cat < test1.txt
hello world
hello world
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# wc -l < test1.txt
2

错误输出重定向 2>,注意 2和>之间不能有空格,2>是一体的时候才表示错误输出

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# cat hhhh.txt 2> out.txt
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# cat out.txt
cat: hhhh.txt: No such file or directory

 特殊重定向 cmd >  out.txt 2>&1,将标准错误输出重定向到标准输出

root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# cat test.py
print("ok")
print("ok")
a = 3 + 4
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# python test.py >out.txt 2>&1
root@LUCAS-DEV-23557e:/mnt/share_disk/wmq/test# cat out.txt
ok
ok
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    print(a,b)
NameError: name 'b' is not defined

参考链接:

[1] Linux Shell 1>/dev/null 2>&1 含义

[2] Linux 里的 2>&1 究竟是什么

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值