输出处理

标准文件描述符

Standard File Descriptors。

名称编号说明
STDIN0标准输入
STDOUT1标准输出
STDERR2标准错误

标准输入

命令 cat 默认从标准输入读取内容,如果直接运行 cat 而不指定文件名,它会等待用户输入。

cat

重定向使用 <

cat < foo
wc < foo

标准输出

默认是终端或屏幕。

echo "hello world"

重定向使用 >1>

echo "hello world" > foo

标准错误

默认是终端或屏幕。

ls 404

重定向使用 2>

ls 404 2> foo

使用 &> 可以同时重定向标准输出和错误输出。

ls 404 &> foo

EXEC 命令

在命令行中使用

exec ls

Shell 进程会被新命令的进程取代,执行完后不会返回到原来的 Shell 中。

在脚本中使用

#!/usr/bin/env bash

exec /bin/date
echo "This will never be executed"

脚本进程会被 date 命令替代,echo 不会执行。

文件描述符重定向

#!/usr/bin/env bash

echo "这将输出到终端"
exec 1> output.txt
echo "这将被写入到 output.txt"

用于修改文件描述符时,不会替换当前进程,只会影响后续命令的输入输出。

关闭文件描述符

重定向到 &- 即可关闭。关闭之后,不能再写数据。

#!/usr/bin/env bash

exec 3> testfile
echo "apple" >&3
exec 3>&-

/dev/null

空设备,位桶。

crw-rw-rw- 1 root root 1, 3 Aug 14 23:16 /dev/null

把标准输出和标准错误重定向到空设备。

command > /dev/null 2>&1

MKTEMP 命令

根据文件名模板,创建临时文件。

filename.XXXXXX

命令会把 X 代替为随机字符,模板最少为 6 个 X。

创建文件

该命令创建的文件只有 Owner 有权限

mktemp foo.XXXXXX
-rw------- 1 kuga kuga 0 Sep  2 17:27 foo.zPtFtG

创建目录

mktemp -d bar.XXXXXX
drwx------ 2 kuga kuga 4096 Sep  2 17:29 bar.RQAMzc

使用 /tmp 目录

使用 -t 选项会在 /tmp 目录创建文件。

mktemp -t foo.XXXXXX
/tmp/foo.0IglAI

TEE 命令

同时把数据重定向到标准输出和文件。

tee - read from standard input and write to standard output and files
date | tee testfile
Mon Sep  2 05:36:44 PM CST 2024
cat testfile
Mon Sep  2 05:36:44 PM CST 2024

屏幕和文件都有同一份数据。