2013-08-30 41 views
11

有一个命令,我不明白:什么是EOF!在bash脚本中?

custom_command << EOF!! 

我要问EOF!在bash脚本中。我确实发现谷歌EOF,但谷歌会忽略“!!”自动,所以我找不到EOF !!。

我知道文件标记的结尾,但我不完全知道它是什么意思与“!!”在脚本中。这是一个标志,迫使某些事情在vim的wq中做一些事情! ?

另外,为什么和什么时候应该使用EOF!而不是EOF?

+0

它是“文件结束” – Juangcg

+2

http://webapps.stackexchange。COM/Q/1479;不是它会帮助你在这里... – Ben

+1

[Heredoc](http://en.wikipedia.org/wiki/Here_document)! – devnull

回答

15

在命令行上,!!将被扩展为最后执行的命令。 bash将打印线为您提供:

$ ls 
a.txt b.txt 
$ cat <<EOF!! 
cat <<EOFls 
> 

在脚本中,虽然,历史扩展默认情况下禁用,所以感叹号是单词的一部分。

#! /bin/bash 
ls 
cat <<EOF!! 
echo 1 
EOFls 
echo 2 

产地:

a.txt b.txt 
script.sh: line 7: warning: here-document at line 3 delimited by end-of-file (wanted `EOF!!') 
echo 1 
EOFls 
echo 2 

为了使历史和历史扩展在脚本中添加以下行:

set -o history 
set -H 
4

您可以使用任何字符串作为此处的文档结束符。

EOF!!正是撰写脚本的人决定使用的。

+0

不,在bash中'EOF !!'会被'EOF <无论你以前的命令是什么>替换'' – knittl

+2

@knittl它不会,'!!'只能在交互式脚本中被替换。 – jlliagre

+1

对。默认情况下,非交互模式下未启用历史记录展开。 +1。 – devnull

0

正如其他人已经写,这是这里的文档。

用于此的令牌应该仔细选择;因为这里的文件包含EOF!!的概率比EOF本身要低,所以他们选择了这个概率。

我想他们在使用前检查了它并没有伤害;脚本中的!!不引用历史记录,但保持原样。

1

这可能只是一个奇怪的heredoc

例子:

cat << EOF!! 
blabla 
EOF!! 

注:脚本文件这仅适用。命令行解析器解释为!!