在日常使用Linux或macOS系统时,很多人习惯直接敲命令看结果。比如输入ls就列出文件,grep查找关键词,结果直接刷在屏幕上。但有时候你可能希望把这些输出保存下来,或者避开错误信息继续运行,这时候就得用上shell命令重定向了。
什么是重定向
简单说,重定向就是把命令原本要输出到屏幕的内容,换成写进文件,或者从某个文件读取输入,而不是手动敲。它不改变命令本身的功能,只是换了个“进出”的路径。
标准输出重定向(> 和 >>)
大多数命令执行后会把结果打印到“标准输出”,默认就是终端屏幕。用>可以把这个输出存到文件里。
ls > file_list.txt
这条命令不会在屏幕上显示文件列表,而是写进file_list.txt。如果这个文件已经存在,内容会被覆盖。要是不想覆盖,想追加内容,就用>>。
echo "new_file.txt" >> file_list.txt
这样就在原文件末尾加上新的一行,不会动之前的数据。
处理错误信息(2>)
有些命令会出错,比如查看一个不存在的文件:
cat no_such_file.txt
系统会报错:No such file or directory。这种提示不是“标准输出”,而是“标准错误”(stderr),编号是2。要用2>才能捕获它。
cat no_such_file.txt 2> error.log
现在错误信息就被写进了error.log,屏幕干干净净。如果你既想保存正常输出,又想单独记录错误,可以两个一起用。
grep "keyword" *.txt > found.txt 2> grep_errors.log
丢掉不需要的内容(/dev/null)
有时候你只关心命令是否成功,不想要任何输出。Linux有个“黑洞”文件叫/dev/null,往它里面写的东西全都会消失。
ping -c 4 example.com > /dev/null 2>&1
这里2>&1的意思是:把标准错误(2)重定向到标准输出(&1)的位置,然后再一起丢进/dev/null。整个命令执行后完全静默,适合写进脚本里做后台检测。
从文件读取输入(<)
重定向不只是输出,输入也能控制。比如sort命令可以对文本排序,通常你得一行行敲内容,但用<可以直接从文件读。
sort < names.txt
这比cat names.txt | sort更简洁,效果一样。对于只接受标准输入的命令,这种方法特别实用。
实际应用场景
假设你在维护一台服务器,每天要检查日志里有没有异常关键词。可以写个简单命令自动完成:
grep "ERROR" /var/log/app.log > /home/user/alerts.log 2> /home/user/grep_error.log
正常匹配结果存进alerts.log,如果日志文件被轮转或权限出问题,错误信息会记在grep_error.log里,不影响其他操作。
再比如批量处理文件时,你希望确认每一步做了什么,但又不想打断流程。可以这样:
for file in *.conf; do
echo "Processing $file..."
process_config "$file"
done > process_log.txt 2>&1
所有过程和错误都记录下来,运行时也不用盯着屏幕。