特殊符号

文件描述符

在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>&-