在 Linux 中,重定向是一种将命令的输出或输入重定向到文件或其他命令的机制。它可以用于管理标准输入、标准输出、标准错误等。重定向通常与命令行中的 >、<、>>、2> 等符号一起使用。下面是关于 Linux 重定向的详细说明。
在 Linux 中,每个进程都有三个默认的 I/O 流:
0。1。2。将命令的输出重定向到文件或设备,而不是显示在终端上。
覆盖写入(>):将标准输出重定向到文件,覆盖文件的原有内容。
bash
command > file示例:将 ls 命令的输出保存到 output.txt 文件中,覆盖原文件内容。
bash
ls > output.txt追加写入(>>):将标准输出重定向到文件,追加到文件末尾,而不覆盖原文件内容。
bash
command >> file示例:将 echo 的输出追加到 output.txt 文件末尾。
bash
echo "New line" >> output.txt将文件的内容作为命令的输入,而不是从终端获取输入。
输入重定向(<):将文件内容重定向为命令的标准输入。
bash
command < file示例:将 input.txt 文件的内容作为 cat 命令的输入。
bash
cat < input.txt错误重定向到文件(2>):将标准错误重定向到文件。
bash
command 2> file示例:将错误信息保存到 error.txt 中。
bash
ls non_existing_file 2> error.txt错误输出追加到文件(2>>):将标准错误输出追加到文件末尾。
bash
command 2>> file将标准输出和标准错误都重定向到同一个文件:
bash
command > file 2>&1或者使用简化的写法(对于某些 shell 支持,如 Bash 4+):
bash
command &> file示例:将 ls 命令的标准输出和标准错误都保存到 output.txt 中。
bash
ls > output.txt 2>&1|)管道用于将一个命令的标准输出作为另一个命令的标准输入。
bash
command1 | command2示例:将 ls 命令的输出通过管道传递给 grep 命令进行过滤。
bash
ls | grep "txt"/dev/null有时你可能不需要某个输出或错误信息,可以将它们重定向到 /dev/null,相当于丢弃输出。
丢弃标准输出:
bash
command > /dev/null丢弃标准错误:
bash
command 2> /dev/null丢弃标准输出和标准错误:
bash
command > /dev/null 2>&1你还可以使用文件描述符编号来进行更细粒度的重定向控制。
重定向标准输出(1>)和标准错误(2>):
bash
command 1> output.txt 2> error.txt将标准输出和错误都重定向到不同的文件:
bash
command > output.txt 2> error.txt将 ls 的输出写入 output.txt,覆盖文件内容:
bash
ls > output.txt将 ls 的输出追加到 output.txt 文件末尾:
bash
ls >> output.txt将错误输出到 error.log,而标准输出保持在终端:
bash
ls non_existing_file 2> error.log丢弃命令的所有输出:
bash
command > /dev/null 2>&1Linux 重定向是管理输入输出的强大工具。通过标准输入、标准输出和标准错误的重定向,结合管道,可以方便地控制命令的 I/O 流,灵活处理输出结果或错误信息。
将命令输出保存到文件中。
>):bash
echo "Hello, World!" > output.txt解释:将字符串 "Hello, World!" 输出到 output.txt,并覆盖文件的原有内容。
>>):bash
echo "Another line" >> output.txt解释:将 "Another line" 追加到 output.txt 文件末尾,而不覆盖之前的内容。
从文件中读取内容作为命令的输入。
<):bash
cat < input.txt解释:将 input.txt 的内容作为 cat 命令的输入并显示出来。
2>):bash
ls non_existing_file 2> error.log解释:ls 命令试图列出一个不存在的文件,导致错误输出,错误信息将被写入 error.log。
2>>):bash
ls another_missing_file 2>> error.log解释:类似地,将错误信息追加到 error.log 文件的末尾,而不覆盖它的原有内容。
bash
ls existing_file non_existing_file > all_output.log 2>&1解释:ls 命令输出的结果(无论是正常输出还是错误输出)都被写入 all_output.log 文件。
bash
ls existing_file non_existing_file &> all_output.logbash
command > /dev/null解释:/dev/null 是一个虚拟设备,丢弃所有发送到它的内容。此命令将 command 的标准输出丢弃。
bash
command 2> /dev/null解释:此命令将 command 的错误输出丢弃。
bash
command > /dev/null 2>&1解释:此命令将 command 的所有输出(包括标准输出和错误输出)都丢弃。
bash
sort < input.txt > sorted_output.txt解释:sort 命令从 input.txt 中读取内容并进行排序,然后将排序结果输出到 sorted_output.txt 文件中。
bash
command > output.txt 2> error.txt解释:将 command 的标准输出保存到 output.txt,错误输出保存到 error.txt。
bash
command >> combined_output.txt 2>&1解释:将 command 的标准输出和错误输出都追加到 combined_output.txt 文件中。
bash
ls | grep ".txt" > txt_files.txt解释:先通过 ls 列出当前目录下的所有文件,然后通过 grep 过滤出 .txt 结尾的文件,并将结果保存到 txt_files.txt 中。
bash
ls | grep ".txt" 2> error.log解释:如果 ls 或 grep 过程中出现错误,错误信息将被写入 error.log 文件,而标准输出仍通过管道传递。
Here Document 是一种用于将多行输入直接嵌入到命令中的输入重定向方式。
<< Here Document 示例:bash
cat << EOF > here_doc.txt This is the first line. This is the second line. EOF解释:cat 命令接收到嵌入式输入并将它们写入到 here_doc.txt 文件中。EOF 是结束标志,EOF 之前的所有内容都会被写入文件。
bash
exec 3> custom_output.txt echo "Output to custom fd" >&3解释:首先使用 exec 3> 创建文件描述符 3 并将其重定向到 custom_output.txt 文件。然后,使用 >&3 将 echo 的输出通过文件描述符 3 重定向到该文件。
bash
exec 3>&-解释:关闭文件描述符 3。
bash
(command1; command2) > combined_output.txt解释:将 command1 和 command2 的输出合并并重定向到 combined_output.txt 文件中。
bash
ls > /dev/tty解释:将 ls 命令的输出直接发送到当前的终端窗口(通常 /dev/tty 代表当前终端设备)。
这些示例展示了 Linux 输入输出重定向的各种应用场景。通过使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的不同组合,你可以灵活地控制命令的输出和错误处理。在自动化脚本和系统管理中,重定向是极为强大的工具。
下面是一个比较全面的 Linux 输入输出重定向示例。这个例子展示了如何结合输入、输出、错误输出的重定向,以及如何使用管道和文件描述符来处理复杂的命令场景。
假设你有一个脚本,负责:
/etc/ 目录下的 .conf 文件。backup.sh):bash
#!/bin/bash
# 定义文件
BACKUP_DIR="/backup"
LOG_FILE="/var/log/backup.log"
ERROR_LOG_FILE="/var/log/backup_error.log"
REPORT_FILE="/var/log/backup_report.txt"
# 确保备份目录存在
mkdir -p $BACKUP_DIR
# 清空或初始化日志文件
> $LOG_FILE
> $ERROR_LOG_FILE
> $REPORT_FILE
# 备份文件
for file in /etc/*.conf; do
if cp $file $BACKUP_DIR 2>> $ERROR_LOG_FILE; then
echo "$(date): Successfully backed up $file" >> $LOG_FILE
echo "$file" >> $REPORT_FILE
else
echo "$(date): Error backing up $file" >> $ERROR_LOG_FILE
fi
done
# 将错误输出中不需要的消息过滤掉并忽略
grep -v "Permission denied" $ERROR_LOG_FILE > temp_error.log
mv temp_error.log $ERROR_LOG_FILE
# 合并日志和错误报告
cat $LOG_FILE $ERROR_LOG_FILE > /var/log/backup_summary.log创建备份目录:
使用 mkdir -p 来创建备份目录,如果目录已存在则不会报错。
bash
mkdir -p $BACKUP_DIR初始化日志文件:
使用 > file 清空或初始化日志文件。> $LOG_FILE 意味着将文件清空,以便我们从头开始记录。
bash
> $LOG_FILE > $ERROR_LOG_FILE > $REPORT_FILE遍历并备份 .conf 文件:
使用 for 循环遍历 /etc/ 目录下的所有 .conf 文件,并使用 cp 命令将文件复制到备份目录。
bash
for file in /etc/*.conf; do处理标准输出与标准错误:
backup.log。2>> $ERROR_LOG_FILE 将 cp 命令的错误信息重定向到错误日志 backup_error.log 中。bash
if cp $file $BACKUP_DIR 2>> $ERROR_LOG_FILE; then
echo "$(date): Successfully backed up $file" >> $LOG_FILE
echo "$file" >> $REPORT_FILE
else
echo "$(date): Error backing up $file" >> $ERROR_LOG_FILE
fi过滤不重要的错误信息:
使用 grep 和重定向将不重要的错误(如 "Permission denied")从错误日志中过滤掉。grep -v "Permission denied" 将过滤掉包含 "Permission denied" 的行。
bash
grep -v "Permission denied" $ERROR_LOG_FILE > temp_error.log
mv temp_error.log $ERROR_LOG_FILE合并日志:
使用 cat 命令将 backup.log 和 backup_error.log 合并成一个 backup_summary.log,形成最终的备份操作报告。
bash
cat $LOG_FILE $ERROR_LOG_FILE > /var/log/backup_summary.log这个脚本展示了如何使用重定向来完成如下操作:
backup.log 文件中。backup_error.log 文件中。<),但你可以通过类似的方式将某个文件作为输入(例如,如果要读取文件列表,可以通过 < 重定向实现)。>> 将每个日志条目或错误条目追加到日志文件的末尾。grep -v 将不重要的错误过滤掉。2>> 将标准错误重定向到指定文件中。这个示例展示了 Linux 重定向和管道的强大功能,如何管理标准输出、标准错误,并结合使用来处理复杂的脚本任务。