特殊符号
文件描述符
在shell脚本中,默认情况下,总是有三个文件处于打开状态:
名称 | 文件描述符 |
---|---|
标准输入(键盘输入) | 0 |
标准输出(输出到屏幕) | 1 |
标准错误(也是输出到屏幕) | 2 |
/dev/null
是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉
尖括号特殊符
参考文档:
https://blog.csdn.net/u011630575/article/details/52151995
https://www.cnblogs.com/lovemo1314/archive/2011/07/13/2105472.html
说明:
-
<
输入重定向。 -
>
输出重定向,等同1>
。 -
>>
输出重定向,进行追加,不会覆盖之前的内容。 -
<<
标准输入来自命令行的一对分隔号的中间内容。 -
2>&1
把 标准错误输出 重定向到 标准输出。&1
表示1输出通道。 如果此处错写成2>1
, 就表示把2输出重定向到文件1中。 -
&>file
把标准输出 和 标准错误输出 都重定向到文件file中。 -
[j]<>filename
为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它。如果文件"filename"不存在, 那么就创建它
如果文件描述符"j"没指定, 那默认是fd 0(stdin)。
示例1
使用ls
命令产生正确输出和错误输出。
ls
a.txt
生成正确和错误输出:
ls a.txt b.txt
ls: cannot access 'b.txt': No such file or directory
a.txt
将输出重定向:
ls a.txt b.txt 1>file.out 2>file.err
ls a.txt b.txt >file.out 2>file.err
说明:
- 执行后,没有任何返回值。原因是, 返回值都重定向到相应的文件中了而不再前端显示。
cat file.out
a.txt
cat file.err
ls: cannot access 'b.txt': No such file or directory
将正确和错误输出到一个文件:
ls a.txt b.txt >file.out 2>&1
下面写法不能将错误重定向到标准输出,原因是: 执行顺序问题
ls a.txt b.txt 2>&1 >file.out
示例2
示例: 写到一个文件中指定的位置。
echo 1234567890 > File # 写字符串到"File".
exec 3<> File # 打开"File"并且将fd 3分配给它.
read -n 4 <&3 # 只读取4个字符.
echo -n . >&3 # 写一个小数点.
exec 3>&- # 关闭fd 3.
cat File # ==> 1234.67890
tee 实现双向重定向
即在重定向数据到目标文件的同时,还要保证数据能够正常处理,使用tee命令。
tee [-a] file
-a
往文件尾添加内容
示例:
last | tee last_backup | cut -d " " -f 1
tee相当于对last的结果备份了一次。
控制台输出:
root
root
root
root
root
wtmp
文件last_backup内容为:
root pts/1 127.0.0.1 Fri Feb 11 13:50 - 08:23 (18:33)
root pts/6 127.0.0.1 Fri Feb 11 11:53 - 12:28 (00:34)
root pts/6 127.0.0.1 Fri Feb 11 11:53 - 11:53 (00:00)
root pts/8 10.130.17.154 Tue Feb 8 17:17 - 19:16 (01:59)
root pts/2 192.168.0.200 Tue Feb 8 10:33 - 19:38 (6+09:04)
wtmp begins Tue Feb 8 10:33:28 2022
总结
命令 | 说明 |
---|---|
command > filename |
把标准输出重定向到一个新文件中 |
command >> filename |
把标准输出重定向到一个文件中(追加) |
command 1 > fielname |
把标准输出重定向到一个文件中 |
command > filename 2>&1 |
把标准输出和标准错误一起重定向到一个文件中 |
command 2 > filename |
把标准错误重定向到一个文件中 |
command 2 >> filename |
把标准输出重定向到一个文件中(追加) |
command >> filename 2>&1 |
把标准输出和标准错误一起重定向到一个文件中(追加) |
command < filename >filename2 |
把command命令以filename文件作为标准输入,以filename2文件作为标准输出 |
command < filename |
把command命令以filename文件作为标准输入 |
command << delimiter |
把从标准输入中读入,直至遇到delimiter分界符 |
command <&m |
把文件描述符m作为标准输入 |
command >&m |
把标准输出重定向到文件描述符m中 |
command <&- |
把关闭标准输入 |
command <&m
示例:
echo 1234567890 > File
exec 3<> File
cat <&3
exec 3>&-