Shell重定向

(3 mins to read)

输入/输出重定向

1
2
3
4
5
6
7
8
command > file # 输出重定向到file
command < file # 输入重定向到file
command >> file # 输出以追加的方式重定向到file
n > file # 文件描述符为n的文件重定向到file
n >> file
n >& m # 输出文件合并
n <& m
<< tag # 将开始标记tag和结束标记tag间的内容作为输入
  • 标准输入:stdin,文件描述符为0
  • 标准输出:stdout,文件描述符为1
  • 标准错误:stderr,文件描述符为2
  • /dev/null
1
command > file 2>&1 # stdout和stderr都输出到file

Here document

1
2
3
n << delimiter
document
delimiter

将两个delimiter间的内容重定向输出后作为标准输入传递给文件描述符n。其中结尾的delimiter需要顶格写,周围不能有空格,但开始的delimiter周围的空格会被忽略。

delimiter应选择不会在document中出现,且不会引起混淆的字符串(字母开头,可包含字母和数字)。

使用<<-,可以让document保持缩进。

delimiter如果加单/双引号,则document中的内容不会进行shell替换,如变量、命令等。

输出重定向在开始的delimiter后指定。

Here string

1
n <<< word # 等价于echo word | n

word加单引号不会进行shell替换,双引号时会。

Command substitution

1
2
3
$(command)
`command`
text="$(command)"

命令替换允许执行命令并用命令的输出替换命令文本。

Process substitution

1
2
3
<(command)
>(command)
diff <(ls dir1) <(ls dir2) # 比较两个命令的输出

进程替换允许将命令的输出保存到一个临时文件(命名管道)中,然后作为另一个命令的输入。

1
2
3
4
5
$ echo <(ls)
/proc/self/fd/13
$ cat <<<"$(ls)"
$ cat < <(ls)
$ echo "$(ls)" | cat

注:诸如管道、输入重定向、here document、here string都是将内容推送到标准输入流中,而进程替换则是保存到一个临时文件中,并用临时文件名来替换命令。这显然更强大。可以通过< <(command)来推送到标准输入流。

另外注意是否添加引号可能会有区别。