检查以确保第 1 行末尾的 \ 后面有 no 个字符(空格、制表符等)。如果它 确实 后面有字符,则不会将其视为续行,而第 2 行将被视为 new 命令,从而调用类似于以下内容的错误你看到的是:
./freezemethod: line 2: syntax error near unexpected token '|'
最好的检查方法是运行如下转储命令:
od -xcb ./freezemethod | head -30l
并检查文件前两行的二进制信息,不起作用的那一行。
作为确认,以下文件testprog.sh:
echo hello \
| cut -c1-2
使用bash testprog.sh运行时,会输出hello的前两个字符:
he
如果您在\ 之后放置一个空格字符,您将看到:
hello
testprog.sh: line 2: syntax error near unexpected token '|'
testprog.sh: line 2: '| cat'
echo 工作正常没有过滤器(输出完整的单词),并且单独的命令导致问题,因为它以 | 开头。
而且,根据您在评论中发布的内容,问题正是 我所描述的。您的od 命令已生成(我对最后一行的补充):
root@w2ran0301:/tmp/#: od -xcb ./freezemethod | head -30l
0000000 636d 6c63 2069 6164 6174 6573 2074 6873
m c c l i d a t a s e t s h
155 143 143 154 151 040 144 141 164 141 163 145 164 040 163 150
0000020 776f 2d20 722d 6365 7275 6973 6576 5c20
o w - - r e c u r s i v e \
157 167 040 055 055 162 145 143 165 162 163 151 166 145 040 134
0000040 0a0d 207c 7761 206b 462d 2f22 2022 2127
^^^^
0a0d 序列是(你必须倒过来读)实际上是一个CR/LF 序列,这意味着你的第一行是:
mccli dataset show --recursive \^M
(^M 代表行尾的 CR)。
这意味着在 \ 和行尾之间有一个 字符,因此 \ 正在转义 it 而不是作为行继续字符。
有许多选项可以从文件中删除这些 CR 字符,例如 this answer 中显示的那些。
一种方法是先备份文件:
cp freezemethod freezemethod-cr
然后使用该备份文件重新创建原始没有回车:
sed 's/\r$//' freezemethod-cr >freezemethod
这应该会给你一个 freezemethod 并带有正确的行尾。