如何在Shell中输入长文本?解决-bash: unexpected token `<`报错
在Shell环境中输入长文本的正确方法(附报错解决)
嘿,我来帮你搞定这个问题!你遇到的 -bash: syntax error near unexpected token '<' 报错,大概率是因为输入长文本的方式不对,Shell误把某些字符当成了命令语法的一部分。下面给你几种实用的解决方案:
1. 用Here Document( heredoc):最常用的多行文本输入方式
这是Shell里处理长文本的标准操作,不管是写入文件还是传给命令都好用。
基本用法
用 << 加上一个自定义的结束标记(比如EOF),然后输入你的长文本,最后单独一行输入结束标记即可:
# 把长文本写入文件 cat > my_long_text.txt <<EOF 这是第一行长文本 第二行可以包含特殊字符,比如 < > & 这些都没问题 第三行甚至可以直接用变量,比如当前用户目录是 $HOME EOF
让文本原样输出(不展开变量)
如果不想让Shell展开文本里的变量、转义字符,就把结束标记用单引号括起来:
cat > my_raw_text.txt <<'EOF' 这里的$HOME会原样显示,不会被替换成实际路径 甚至可以写`echo "test"`这类命令,也不会被执行 EOF
⚠️ 注意:结束标记必须单独占一行,前后不能有任何空格或其他字符,否则Shell会一直等待你输入真正的结束标记。
2. 用Here String( herestring):适合单行长文本
如果你的长文本是单行的,用 <<< 更简洁,直接把文本作为命令的输入:
# 给grep命令传长文本作为输入 grep "重要关键词" <<< "这是一段超级长的单行文本,里面可以包含各种符号,不需要担心换行问题,直接用<<<就能快速传给命令处理"
3. 反斜杠换行:临时输入多行命令/文本
如果只是临时在命令行输入多行内容,每一行结尾加反斜杠 \,Shell就会认为命令还没结束,继续等待你输入下一行:
echo "第一行内容 \ 第二行内容 \ 第三行内容"
⚠️ 注意:反斜杠后面不能有空格,否则会触发语法错误,这也是很多人踩坑的点。
为什么会出现<相关的语法错误?
你遇到的报错,通常是因为:
- 输入多行时没加反斜杠,Shell把下一行的
<当成了意外的重定向符号; - 误写了重定向语法(比如只写了
<却没指定输入文件); - heredoc的结束标记格式不对,导致Shell误解析了文本里的
<。
按照上面的方法来,就能避免这类问题啦!
内容的提问来源于stack exchange,提问作者Tinler
相关产品推荐
相关产品推荐

