13

有一个命令我不明白:

custom_command << EOF!!

我想问什么EOF!!在 bash 脚本中。我确实用谷歌找到了EOF,但谷歌会忽略“!!” 自动,所以我找不到EOF !!。

我知道文件标记的结尾,但我不完全知道“!!”是什么意思 在脚本中。这是强制执行某些操作的标记吗,例如在 vim 的 wq 中!?

另外,我们为什么以及何时应该使用 EOF!!而不是EOF?

4

5 回答 5

16

在命令行上,!!将扩展为最后执行的命令。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
于 2013-08-30T07:33:27.150 回答
4

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

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

于 2013-08-30T07:27:33.227 回答
1

这可能只是一个奇怪的heredoc

例子:

cat << EOF!!
blabla
EOF!!

注意:这只适用于脚本文件。命令行解析器解释!!.

于 2013-08-30T07:52:36.910 回答
0

正如其他人已经写的那样,这是一个here-document。

应谨慎选择用于此目的的代币;由于此处文档包含的概率EOF!!低于EOF其自身的概率,因此他们选择了它。

我想他们在使用它之前检查了它是否有害;!!在脚本中并不引用历史,但它保持原样。

于 2013-08-30T07:48:36.580 回答
-1

bash 手册“事件指示符”下列出了这一点,说:

!!

参考前面的命令。这是 !-1` 的同义词。

我只是搜索了“bash 手动双感叹号”。

于 2013-08-30T07:26:16.787 回答