本网站相关文章:

基础知识

重定向常见语法有如下基类:

  • 输入重定向: <
  • 输出重定向: >
  • 输出追加: >>
  • 输入输出: <>
  • 关闭文件描述符: &-

一些常见的设备文件

1
2
3
4
5
6
7
8
9
/dev/fd/{num}               该目录下存在任何有效整数,表示该文件描述符已经被复制,例如0被复制到stdin

/dev/stdin 复制文件描述符0
/dev/stdout 复制文件描述符1
/dev/stderr 复制文件描述符2
/dev/null 特殊的设备文件, 丢弃一切写入的数据, 一旦读取立刻返回EOF

/dev/tcp/主机号/端口号 某一个TCP连接
/dev/udp/主机号/端口号 某一个UDP连接

平常脚本编写过程中经常使用到 0, 1, 2 描述符, 描述符在使用过程中有一些特殊的语法:

  • 对 descriptor 的引用语法: &[descriptor num], 例如2>&1实际上就是将标准输出重定向到标准错误中
  • 若未指定 descriptor, 则默认为 stdout

重定向分类

  1. 输入重定向

格式为fd<file 或者fd<<END, 功能: 打开 file 指向的文件以便读取,并将其作为文件描述符 fd, 默认 fd 为 stdin, 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# a. 统计文件个数, 注意这里默认将fd隐藏了
wc -l < count.txt
# 等价于(wc -l 统计标准输入信息)
wc -l 0<count.txt

# b. Here Document语法, 将两个delimiter中的内容传递给命令, 注意这里使用<<而非<
wc -l << EOF
this is a test
ls
pwd
EOF
# 等价于
wc -l 0<< EOF
this is a test
ls
pwd
EOF

注意, 如果 fd 非默认值则 fd 和<之间不能有空格, 这种格式要求适用于下面的所有类型.

  1. 输出重定向
    格式为fd>file, fd>>file, fd>|file, 功能: 输出重定向或者追加到指定的文件中, 默认 fd 为 stdout, 例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# a. 输出重定向, 注意, 不能写成1 >output.txt, 否则会识别成: 1 1>output.txt
echo "this is a test" 1>output.txt
# 等价于
echo "this is a test" >output.txt

# b. 使用管道避免一些异常情况下无法重定向问题
echo "this is a test" >|output.txt
# 实际执行命令
echo "this is a test" 2>1 | 1>output.txt

# c. 标准错误重定向
errorcmd 2>error.txt

# d. 追加
echo "this is a append test" >> output.txt
echo "this is a append test" 1>> output.txt

输出和错误输出重定向

格式:&>单词 或者 >&单词,优先使用第一种,但一般使用第二种

说明:等价于: >单词 2>&1

注意:从等价可以看出当前用法是一个特殊情况, 其中使用 descriptor 重定向到其他描述符时需要在目标描述符前加&
引用某个描述符的值: &1

输出和错误输出重定向的追加

格式:&>>单词

等价于: >>单词 2>&1

复制输入文件描述符

1
格式:[n]<&单词

说明:如果单词为-,表示关闭文件描述符 n,如果单词没有指定任何值,发生错误,默认 n 为 stdin

复制输出文件描述符

格式:[n]>&单词

说明:如果没有指定 n,默认为 stdout,特殊情况>&,见上面的输出和错误输出重定向,单词可以不是数字

转移文件描述符

1
2
3
4
5
格式:[n]<&数字-
说明:如果没有指定n,默认为stdin,将文件描述符"数字”转移到n上,并关闭文件描述符"数字”

格式:[n]>&数字-
说明:将文件描述符"数字”转移到n上,默认为stdout,注意,这两者方向都是一致的

输入输出描述符

1
2
格式:[n]<>单词
说明:如果没有指定n,默认为stdin,打开单词以便读写

命令行简单操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 输出和错误重定向重定向一个文件
lba 2>/tmp/s1
# 同时重定向输出和错误
ls -la 2> /tmp/err 1>/tmp/out
ls -la &> /tmp/err-out

# 输入重定向
cat </tmp/s1
cat 0</tmp/s1
脚本中重定向:
# 临时重定向
echo "xxxxxxxxxxxx" >& 2
lb >& file1
echo "xxxxxxxxxxxx3" > file2

# 永久重定向
exec 1> out1
echo "xxxxxxxxxxxx1"
echo "xxxxxxxxxxxx2"

# 输入重定向
exec 0< infile.sh

创建文件描述符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 常常用作临时存放0/1/2的容器
exec 3>& 1
exec 1> out1
echo "xxxxxxxxxxxxxxxxx"
exec 1>& 3

# 创建读写文件描述符
exec 3<> file2
while read line <& 3
do
echo "$line"
done

# 关闭文件描述符
exec 3>&-