【发布时间】:2015-06-08 16:44:02
【问题描述】:
操作系统: Debian 7 Wheezy GNU\Linux
语言: Bash
已审核的文档: wiki/heredoc
什么有效:
cat > software.temp <<- EOF
gparted
baobab
EOF
什么没有
prefer="/etc/apt/preferences.d/${reponame}"
cat <<- EOF >> ${prefer}
Package: *
Pin: release l=Debian
Pin-Priority: 110
EOF
是的,我知道它是相反的,这可能是我没有让它工作的原因。基本上得到了古老的“找不到EOF”错误。请注意上面的每个块都用 TAB 缩进一次或多次。你可以看到我的代码here。我想知道是不是因为我试图引导输入/输出。
我可能以为是下面这样的东西,但这也没有用。
cat <<- EOF
Package: *
Pin: release l=Debian
Pin-Priority: 110
EOF >> ${prefer}
【问题讨论】:
-
您可以在 here-doc 之前或之后放置 I/O 重定向。如果你想通过管道输出 here-doc 的输出,管道必须在它之后:
cat file - <<-EOF | whatever(其中whatever- 接收输出的命令 - 可以在此处结束后的单独行上 -文档)。如果您不使用带引号的“单词”形式,请注意不要将 here-doc 的单词括在引号中(<<- 'EOF'); the shell expands variables and$(...)` 命令替换(以及反引号版本)。 -
我试过
cat - <<- EOF | cat >> ${prefer},但这似乎不起作用(以EOF结尾。如果有帮助,您可以查看我的code。 -
您在使用 Debian?您确定您的脚本不是由
dash而不是bash运行的吗?两者在某些方面表现不同,我不确定对 here-docs 的处理是否不是其中一种方式。当你运行bash -x add-debian-repos.sh时你看到了什么?它与dash -x add-debian-repos.sh或sh -x add-debian-repos.sh的行为是否不同?您能否创建一个 MCVE (Minimal, Complete, Verifiable Example),它不会修改任何人的系统管理内容,但会证明问题所在? -
还是和
/bin/bash add-debian-repos一样。您可以将what works 与what does not work 进行比较以供参考。这些分别来自我的稳定/测试分支。谢谢你的帮助乔纳森。破折号给了我“未终止的引号字符串”,而 bash 给出了“意外的 EOF,同时寻找匹配的 `”' -
<<或<<-与单词之间有一个空格。 POSIX 文档 (Here document) 没有空格。不过,这正在抓住稻草。我在我的机器(Ubuntu 14.04 LTS 衍生版本)上使用我的测试代码(只是松散地基于你的)找不到与 bash、dash 或 sh 的区别。从下载中,您似乎在缩进中有标签,所以您应该没问题。 (这给我带来了一个问题;本地编码标准是无制表符的,因此需要恶作剧才能将制表符放入文件中。)