文件描述符 | 文件名 | 类型 | 硬件 |
---|---|---|---|
0 | stdin | 标准输入文件 | 键盘 |
1 | stdout | 标准输出文件 | 显示器 |
2 | stderr | 标准错误输出文件 | 显示器 |
类 型 | 符 号 | 作 用 |
---|---|---|
标准输出重定向 | command >file | 以覆盖的方式,把 command 的正确输出结果输出到 file 文件中。 |
command >>file | 以追加的方式,把 command 的正确输出结果输出到 file 文件中。 | |
标准错误输出重定向 | command 2>file | 以覆盖的方式,把 command 的错误信息输出到 file 文件中。 |
command 2>>file | 以追加的方式,把 command 的错误信息输出到 file 文件中。 | |
正确输出和错误信息同时保存 | command >file 2>&1 | 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 |
command >>file 2>&1 | 以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 | |
command >file1 2>file2 | 以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | |
command >>file1 2>>file2 | 以追加的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | |
command >file 2>file | 【不推荐】这两种写法会导致 file 被打开两次,引起资源竞争,所以 stdout 和 stderr 会互相覆盖,我们将在《结合Linux文件描述符谈重定向,彻底理解重定向的本质》一节中深入剖析。 | |
command >>file 2>>file |
>
代表的是覆盖,>>
代表的是追加。
fd>file
或者fd>>file
,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。command >file
写作command 1>file
,但这样做是多此一举。fd
和>
之间不能有空格,否则 Shell 会解析失败;>
和file
之间的空格可有可无。为了保持一致,我习惯在>
两边都不加空格。echo "task.lmcjl.com" 1 >log.txt
注意1
和>
之间的空格。echo 命令的输出结果是task.lmcjl.com
,我们的初衷是将输出结果重定向到 log.txt,但是当你打开 log.txt 文件后,发现文件的内容为task.lmcjl.com 1
,这就是多余的空格导致的解析错误。也就是说,Shell 将该条语句理解成了下面的形式:
echo "task.lmcjl.com" 1 1>log.txt
#!/bin/bash for str in "C语言中文网" "http://task.lmcjl.com/" "成立7年了" "日IP数万" do echo $str >>demo.txt #将输入结果以追加的方式重定向到文件 done运行以上脚本,使用
cat demo.txt
查看文件内容,显示如下:ls -l
命令的输出结果重定向到文件中。
[task.lmcjl.com]$ ls -l #先预览一下输出结果 总用量 16 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-r--r--. 1 mozhiyan mozhiyan 399 3月 11 17:12 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 67 3月 22 17:16 demo.txt -rw-rw-r--. 1 mozhiyan mozhiyan 278 3月 16 17:17 main.c -rwxr-xr-x. 1 mozhiyan mozhiyan 187 3月 22 17:16 test.sh [task.lmcjl.com]$ ls -l >demo.txt #重定向 [task.lmcjl.com]$ cat demo.txt #查看文件内容 总用量 12 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-r--r--. 1 mozhiyan mozhiyan 399 3月 11 17:12 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 0 3月 22 17:21 demo.txt -rw-rw-r--. 1 mozhiyan mozhiyan 278 3月 16 17:17 main.c -rwxr-xr-x. 1 mozhiyan mozhiyan 187 3月 22 17:16 test.sh
[task.lmcjl.com]$ ls java #先预览一下错误信息 ls: 无法访问java: 没有那个文件或目录 [task.lmcjl.com]$ ls java 2>err.log #重定向 [task.lmcjl.com]$ cat err.log #查看文件 ls: 无法访问java: 没有那个文件或目录
[task.lmcjl.com]$ ls -l >out.log 2>&1 [task.lmcjl.com]$ ls java >>out.log 2>&1 [task.lmcjl.com]$ cat out.log 总用量 12 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-r--r--. 1 mozhiyan mozhiyan 399 3月 11 17:12 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 278 3月 16 17:17 main.c -rw-rw-r--. 1 mozhiyan mozhiyan 0 3月 22 17:39 out.log -rwxr-xr-x. 1 mozhiyan mozhiyan 187 3月 22 17:16 test.sh ls: 无法访问java: 没有那个文件或目录out.log 的最后一行是错误信息,其它行都是正确的输出结果。
ls -l >>out.log 2>>err.log
这样一来,正确的输出结果会写入到 out.log,而错误的信息则会写入到 err.log。ls -l &>/dev/null
大家可以把 /dev/null 当成 Linux 系统的垃圾箱,任何放入垃圾箱的数据都会被丢弃,不能恢复。符号 | 说明 |
---|---|
command <file | 将 file 文件中的内容作为 command 的输入。 |
command <<END | 从标准输入(键盘)中读取数据,直到遇见分界符 END 才停止(分界符可以是任意的字符串,用户自己定义)。 |
command <file1 >file2 | 将 file1 作为 command 的输入,并将 command 的处理结果输出到 file2。 |
fd<file
,其中 fd 表示文件描述符,如果不写,默认为 0,也就是标准输入文件。wc [选项] [文件名]
其中,-c
选项统计字节数,-w
选项统计单词数,-l
选项统计行数。[task.lmcjl.com]$ cat readme.txt #预览一下文件内容 C语言中文网 http://task.lmcjl.com/ 成立7年了 日IP数万 [task.lmcjl.com]$ wc -l <readme.txt #输入重定向 4
#!/bin/bash while read str; do echo $str done <readme.txt运行结果:
<<
,这个符号的作用是使用特定的分界符作为命令输入的结束标志,而不使用 Ctrl+D 键。
[task.lmcjl.com]$ wc -l <<END > 123 > 789 > abc > xyz > END 4wc 命令会一直等待用输入,直到遇见分界符 END 才结束读取。
<<
之后的分界符可以自由定义,只要再碰到相同的分界符,两个分界符之间的内容将作为命令的输入(不包括分界符本身)。
本文链接:http://task.lmcjl.com/news/7160.html