Shell 命令之文件描述符,重定向

1. 文件描述符

类型 文件描述符 默认情况 对应文件句柄位置
标准输入(standard input) 0 从键盘获得输入 /proc/self/fd/0
标准输出(standard output) 1 输出到屏幕(即控制台) /proc/self/fd/1
错误输出(error output) 2 输出到屏幕(即控制台) /proc/self/fd/2

2. 重定向

主要有三个符号, 箭头指向表示方向

  • ><: 覆盖
  • >><< : 追加
  • >&<& : 分别将输出文件和输入文件合并

1. 输出重定向

标准输出可以省略, 即 ls 1>a.txt 等价于 ls >a.txt

  • ls 1>a.txt, ls 1>>a.txt : 把标准输出重定向和追加到新文件中, 可省略 1
  • ls 2>a.txt, ls 2>>a.txt : 把标准错误重定向和追加到新文件中

2. 输入重定向

  • ls <a.txt, ls 0<a.txt : 以文件作为标准输入
  • ls <<[delimiter] : 从标准输入中读入, 直到遇到 delimiter 分隔符

3. 自定义文件描述符

exec 命令创建全新的文件描述符, 常用的打开模式有3种

  • 只读模式 : 使用 < 操作符将文件读入
  • 截断写入模式 : 使用 > 操作符用于截断模式的文件写入
  • 追加写入模式 : 使用 >> 操作符用于追加模式的文件写入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 创建一个用于读取文件的文件描述符
$ echo this is a test line > input.txt
$ exec 3<input.txt #使用文件描述符3打开并读取文件
$ cat<&3
this is a test line
# 如果要再次读取, 需要用 exec 重新创建一个新的文件描述符

# 2. 创建一个用于写入(截断模式)的文件描述符
$ exec 4>output.txt #打开文件进行写入
$ echo newline >&4
$ cat output.txt
newline

# 3. 创建一个用于写入(追加模式)的文件描述符
$ exec 5>>input.txt
$ echo appended line >&5
$ cat input.txt
newline
appended line

4. 其他

  1. 短横线 - 可以将输出流复制一份传递
1
2
3
4
# 123 打印两遍
$ echo 123 | tee -
# 类似 scp, 将 jdk.tar.gz 的输出流重定向到 /tmp/jdk.tar.gz, 并 ssh 实现远程拷贝
$ cat jdk.tar.gz | ssh 192.168.1.11 'cat - > /tmp/jdk.tar.gz'