Linux <、<<输入重定向

介绍

输入重定向是 < 、 <<(把内容喂给命令的标准输入 stdin)

一、< 标准输入重定向

语法:

命令 < 文件名

含义:把文件内容当作命令的标准输入,替代键盘手动输入。

例子1:cat 读取文件

# 等价 cat test.txt
cat < test.txt
  • cat test.txt:cat 命令直接打开文件作为参数
  • cat < test.txt:shell 打开文件,把文件内容送入 cat 的标准输入>

效果看起来一样,但原理不同:前者是命令自己读文件;后者是shell重定向输入流。

例子2:sort 对文件内容排序

sort < names.txt

把 names.txt 的内容作为 sort 的输入进行排序输出。

例子3:mysql 导入SQL脚本(最常用场景)

mysql -uroot -p dbname < init.sql

把 init.sql 里面的SQL语句,作为mysql客户端的输入批量执行。

补充:可以组合管道+重定向

grep "error" < log.txt

二、<< Here Document(HereDoc,多行输入重定向)

<< 叫做此处文档,直接在命令行里写多行文本,作为命令的输入,不需要文件。
语法:

命令 << 分隔符
内容行1
内容行2
内容行3
分隔符

规则:

  1. << 后面自定义结束标记符(常用 EOF / END,随便起名,大小写敏感)
  2. 中间所有行都会作为命令的标准输入
  3. 单独一行完全匹配分隔符(不能有空格),代表输入结束

示例1:cat 打印多行文本

cat << EOF
Hello Linux
输入重定向演示
第二行
EOF

运行后输出:

Hello Linux
输入重定向演示
第二行

示例2:写入文件(< + << 组合,非常常用)

cat << EOF > test.txt
name:zhangsan
age:20
EOF

解析:<<EOF 提供多行输入,> 把cat的输出重定向写入 test.txt

示例3:变量替换(默认开启变量解析)

name="lisi"
cat << EOF
my name is $name
EOF

输出:my name is lisi

关闭变量替换:<<'EOF' 加引号

分隔符加引号,里面 $ 不再解析,原样输出:

name="lisi"
cat << 'EOF'
my name is $name
EOF

输出:my name is $name

示例4:带减号 <<-EOF(忽略行首Tab缩进)

<<- 会删除每行开头的tab(空格不会删),方便shell脚本里缩进排版

cat <<-EOF
	这一行前面是Tab,输出会去掉Tab
普通行
EOF

⚠️ 只能删除Tab,空格无效;结束标记EOF前面也可以加Tab。

三、< 和 << 对比总结

符号 名称 来源 用途
< 输入重定向 文件 读取一个文件,作为命令stdin
<< HereDoc 内联多行文本 脚本里写多行内容,无需临时文件
<<< HereString 单行字符串 简短单行输入

四、容易踩坑的注意事项

  1. HereDoc结束标记 EOF 必须单独一行,前后不能有多余字符(<<-EOF允许前面有Tab)
  2. 重定向是shell处理,顺序优先级:shell先处理重定向,再执行命令
  3. < 后面文件不存在直接报错;<< 不需要文件
  4. 不要混淆:
    • cmd > file:输出重定向(stdout→文件)
    • cmd < file:输入重定向(文件→stdin)

五、综合练习脚本

新建 input_demo.sh

#!/bin/bash
# 1. HereDoc写入配置文件
cat << EOF > config.ini
[base]
port=8080
author=linux-test
EOF

# 2. <读取文件输入给cat
echo "====读取config.ini===="
cat < config.ini
chmod +x input_demo.sh
./input_demo.sh

原文出处:/show_1GW42fg64cDo.html