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 究竟是什么