1.6 玩转文件描述符及重定向

《Linux Shell 脚本攻略(第 2 版)》读书笔记

文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符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 <log.txt 与下一个 EOF 行之间的所有文本行都会被当做stdin数据。

自定义文件描述符

可以使用 exec 命令创建自己的文件描述符。

  • < 操作符用于从文件中读取值 stdin (只读模式
  • > 操作符用于截断模式的文件写入
  • >> 操作符用于追加模式的文件写入

创建一个文件描述符进行文件读取:

exec 3

创建一个文件描述符用于写入(截断模式)

exec 4>output.txt
echo newline >&4

创建一个文件描述符用于写入(追加模式)

exec 5>>output.txt
echo appended line >&

你可能感兴趣的:(1.6 玩转文件描述符及重定向)