Bash脚本中Here Document配合日志重定向时出现语法错误的原因咨询
Bash脚本中Here Document配合日志重定向时出现语法错误的原因咨询
嗨,这个问题的核心原因是你误用了Bash里的**双括号((...))**语法哦~
先给你掰扯清楚:双括号((...))是Bash专门用来处理算术表达式运算的语法,比如写((counter += 1))这种累加操作才用它,它根本不是用来包裹普通命令块的命令分组工具。你第一个脚本里用((...))其实是碰巧没触发明显报错(严格来说这也是语法问题,只是Bash做了容错处理),但当你在里面放Here Document(<<EOF)的时候,Bash就彻底懵了——它会把Here Document的结束标记EOF当成算术表达式的一部分,完全不认为这是用来结束Here Document的信号,自然就会报出找不到EOF、后续文本被当成陌生命令的错误。
那正确的姿势是什么呢?你应该用单括号(...)来做子shell的命令分组,或者用大括号{...}(注意大括号前后必须加空格,结尾还要加;)。另外你原来的重定向写法&2>1也是错的,正确合并stderr到stdout的写法是2>&1,这个顺序不能乱。
给你修正后的脚本例子:
#!/usr/bin/env bash some_command_1 ( cat <<EOF Some text (in parenthness too) Another text without them EOF ) 2>&1 | tee log.txt some_command_2 exit 0
这样修改后,Here Document能被正确识别,同时也能实现把所有输出(stdout+stderr)同时打印到终端和写入日志文件的需求。
备注:内容来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

