shell中与>和<相关的数据流重定向操作符整理
- 输出重定向操作符
- >
- >>
- 2>
- 2>>
- &> 或 >&
- &>>
- 输入重定向操作符
- <
- <<
- <<<
- 组合重定向
- 2>&1
- 文件描述符相关重定向
- [n]< file 和 [n]> file
- >&- 和 <&-
- 重定向到设备文件相关
- > /dev/null 和 2> /dev/null
- 在网络通信相关场景(结合输入输出重定向思想)
- 进程间通信相关的输入输出操作思路
- 特殊文件系统操作中的重定向
在Shell中,< 和 > 相关的操作符主要用于输入输出重定向
输出重定向操作符
>
- 作用:将命令的标准输出覆盖写入到指定文件中,如果文件不存在,则创建该文件;如果文件已存在,则会清空文件内容后再写入(错误信息不会输入进去)
echo "Hello, World!" > test.txt
>>
- 作用:将命令的标准输出追加到指定文件的末尾,如果文件不存在,则创建该文件(错误信息不会输入进去)
echo "Appended text" >> test.txt
2>
- 作用:将命令的标准错误输出重定向到指定文件(正确信息不会输入进去)
ls non_existent_file 2> error.log
ls non_existent_file 会产生一个错误,因为 non_existent_file 文件不存在,这个错误信息以覆盖的方式会被重定向到 error.log 文件中,而不会显示在终端上
2>>
- 作用:将命令的标准错误输出追加到指定文件的末尾(正确信息不会输入进去)
ls non_existent_file 2>> error.log
再次执行 ls non_existent_file 时,新的错误信息会被追加到 error.log 文件的末尾
&> 或 >&
- 作用:将命令的标准输出和标准错误输出都重定向到同一个文件
ls non_existent_file &> all_output.log
这样,ls 命令的标准输出(如果有)和标准错误输出都会被写入到 all_output.log 文件中
&>>
- 作用:把标准输出和标准错误输出都追加到指定文件末尾,它结合了标准输出追加(>>)和标准错误输出追加(2>>)的功能
ls non_existent_file &>> combined.log
该命令会将 ls 命令执行过程中的标准输出(如果有)和标准错误输出追加到 combined.log 文件中
输入重定向操作符
<
- 作用:将指定文件的内容作为命令的输入
wc -l < test.txt
wc -l 命令用于统计行数,通过 < test.txt 把 test.txt 文件的内容作为输入,统计该文件的行数
<<
- 作用:用于向命令提供多行输入,可在脚本中嵌入一段文本块,并将其作为命令的输入,以指定的结束标记(如 EOF)来界定文本块的开始和结束(约定俗成用EOF,但使用其他例如aaa,bbb作为开始结束标识也可以)
cat << EOF
This is a multi-line text.
It can contain multiple lines.
EOF
cat 命令会将这段多行文本输出到终端
<<<
- 作用:将一个字符串作为命令的输入
grep "example" <<< "This is an example string."
grep 命令会在 “This is an example string.” 中查找 “example” 并输出匹配的行
组合重定向
2>&1
- 作用:将标准错误输出重定向到标准输出,通常与其他重定向操作符结合使用,将标准输出和标准错误输出都重定向到同一个地方
ls non_existent_file 2>&1 | tee output.log
ls 命令的标准输出和标准错误输出都会通过管道传递给 tee 命令,tee 命令会将内容同时输出到终端和 output.log 文件中
文件描述符相关重定向
[n]< file 和 [n]> file
- 作用:n 代表文件描述符,默认情况下,0 是标准输入(stdin),1 是标准输出(stdout),2 是标准错误输出(stderr),可以使用其他文件描述符进行更灵活的输入输出重定向
exec 3> logfile.txt
echo "This will go to the log file" >&3
exec 3>&- # 关闭文件描述符 3
这里先将文件描述符 3 重定向到 logfile.txt 文件,然后将字符串 “This will go to the log file” 输出到文件描述符 3 对应的文件中,最后关闭文件描述符 3
>&- 和 <&-
- 作用
- >&-:用于关闭文件描述符的输出,当已经完成了对某个文件描述符的输出操作,并且想要释放该资源时,可以使用此操作符关闭它
- <&-:用于关闭文件描述符的输入,通常在不再需要从某个文件描述符读取输入时使用
# 打开文件描述符 3 用于写入
exec 3> output.txt
echo "Writing to file descriptor 3" >&3
# 关闭文件描述符 3 的输出
exec 3>&-
# 打开文件描述符 4 用于读取
exec 4< input.txt
read line <&4
echo "Read line: $line"
# 关闭文件描述符 4 的输入
exec 4<&-
重定向到设备文件相关
> /dev/null 和 2> /dev/null
- 作用
- > /dev/null:将命令的标准输出丢弃,即不将标准输出显示在终端或保存到文件中,/dev/null 是一个特殊的设备文件,被称为“黑洞”,所有写入它的数据都会被丢弃
- 2> /dev/null:将命令的标准错误输出丢弃
# 丢弃标准输出
ls non_existent_file > /dev/null
# 丢弃标准错误输出
ls non_existent_file 2> /dev/null
# 同时丢弃标准输出和标准错误输出
ls non_existent_file &> /dev/null
在网络通信相关场景(结合输入输出重定向思想)
通过管道和重定向实现简单网络交互(在有合适工具的情况下)
- 作用:借助网络工具(如 nc 即 netcat),结合重定向可以实现简单的网络通信,可以将本地命令的输出发送到远程主机,或者将远程主机的响应作为本地命令的输入
- 示例
# 作为客户端向远程服务器发送消息
echo "Hello, server!" | nc example.com 80 > response.txt
# 这里将 "Hello, server!" 发送到 example.com 的 80 端口
# 并将服务器的响应保存到 response.txt 文件中
进程间通信相关的输入输出操作思路
通过命名管道(FIFO)结合重定向
- 作用:命名管道是一种特殊的文件类型,可用于不同进程之间的通信,可以利用重定向将数据写入命名管道,也可以从命名管道读取数据
# 创建命名管道
mkfifo myfifo
# 一个进程向管道写入数据
echo "Data for the other process" > myfifo &
# 另一个进程从管道读取数据
read data < myfifo
echo "Read data: $data"
# 删除命名管道
rm myfifo
特殊文件系统操作中的重定向
利用重定向修改系统配置文件(需权限)
- 作用:在某些情况下,需要修改系统配置文件,可借助重定向将修改后的内容覆盖写入到配置文件中,但要注意这种操作需要相应的权限
# 假设要修改 hosts 文件添加一条记录
echo "127.0.0.1 mydomain.local" | tee -a /etc/hosts > /dev/null
# tee -a 用于将输入追加到文件中,结合重定向操作