文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0 、 1以及2是系统预留的。
- 0 —— stdin(标准输入)
- 1 —— stdout(标准输出)
- 2 —— stderr(标准错误)
将输出文本重新定向或保存到一个文件中
echo "This is a sample text 1" > temp.txt
将文本追加到目标文件中
echo "This is a sample text 2" >> temp.txt
标准错误
当命令输出错误信息时,stderr 信息就会被打印出来。
ls + # + 是一个非法参数
ls: cannot access +: No such file or directory
成功和不成功的命令
当一个命令发生错误并退回时,它会返回一个非 0 的退出状态;而当命令成功完成后,它会返回数字 0。退出状态可以从特殊变量
$?
中获取(在命令执行后立刻运行echo $?
,就可以打印出退出状态)。
将 stderr 重定向到 out.txt:
ls + 2> out.txt
可以将 stderr 单独重定向到一个文件,将 stdout 重定向到另一个文件:
cmd 2>stderr.txt 1>stdout.txt
还可以将 stderr 转换成 stdout,使得 stderr 和 stdout 都被重定向到同一个文件中:
cmd &> output.txt
舍弃错误信息
cmd 2>/dev/null
既可以将数据重定向到文件,还可以提供一份重定数据的副本作为后续命令的 stdin
下面的代码中,tee 命令接收到来自 stdin 的数据。它将 stdout 的一份副本写入 out.txt,同时将另一份副本作为后续命令的 stdin。命令 cat -n
将从 stdin 中接收到的每一行数据前奖赏行号并写入 stdout:
$ cat a* | tee out.txt | cat -n
cat: a1: Permission denied
1 a1
2 a1
注意,tee 只能从 stdin 中读取。
默认情况下,tee 命令会将文件覆盖,但是它提供了一个 -a 选项,用于追加内容
cat a* | tee -a out.txt | cat -n
将文件重定向到命令
cmd < file
将脚本内部的文本进行重定向
#!/bin/bash
cat << EOF > log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics
EOF
在 cat <<EOF>log.txt
与下一个 EOF 行之间的所有文本行都会被当做stdin数据。
自定义文件描述符
可以使用 exec 命令创建自己的文件描述符。
- < 操作符用于从文件中读取值 stdin (只读模式)
- > 操作符用于截断模式的文件写入
- >> 操作符用于追加模式的文件写入
创建一个文件描述符进行文件读取:
exec 3<input.txt #创建
cat <&3 #使用
创建一个文件描述符用于写入(截断模式)
exec 4>output.txt
echo newline >&4
创建一个文件描述符用于写入(追加模式)
exec 5>>output.txt
echo appended line >&