2013-08-30 18 views
11

私は理解していないコマンドがあります:EOFとは何ですか? bashスクリプトで?

custom_command << EOF!! 

私は何EOFを聞いてみたいです! bashスクリプトにあります。私はgoogleでEOFを見つけましたが、googleは "!!"自動的に、私はEOFを見つけることができません!!

私はファイルトークンの終わりを知っていますが、「!!」の意味を正確には分かりません。スクリプトでvimのwqのような何かを強制するためのマークですか? ?

さらに、なぜ、いつ、私たちはEOFを使用すべきですか? EOFの代わりに? "Event designators"

+0

"ファイルの最後" – Juangcg

+2

http://webapps.stackexchangeです。com/q/1479;それはあなたをここで助けるではない... – Ben

+1

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

答えて

15

コマンドラインで!!が最後に実行されたコマンドに展開されます。

スクリプトで
$ ls 
a.txt b.txt 
$ cat <<EOF!! 
cat <<EOFls 
> 

、しかし、歴史の展開はデフォルトで無効になっていますので、感嘆符は、単語の一部です:bashはあなたのための行を印刷します。

#! /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 
-1

The bash manualリストこのことを、言って:

!!

は、前のコマンドを参照してください。これは!-1`の同義語です。

「bash manual double exclamation」を検索しました。

4

ここではドキュメントターミネータの文字列を使用できます。

EOF!!は、スクリプトを書く人が使用することに決めたものです。

+0

いいえ、bashで 'EOF !!'は 'EOF <あなたの前のコマンドが何であっても> 'に置き換えられます。 – knittl

+2

@knittlそうではありません、' !! 'は対話的なスクリプトでのみ置き換えられます。 – jlliagre

+1

右。デフォルトでは、非対話モードでは履歴拡張は有効になっていません。 +1。 – devnull

0

を、これはヒアドキュメントです。

使用するトークンは慎重に選択する必要があります。ここの文書にEOF!!が含まれている確率がEOFの場合よりも低いので、彼らはそれを選択しました。

私は彼らがそれを使用する前に害を及ぼさないことを確認したと仮定します。スクリプトの!!は履歴を参照していませんが、そのままの状態です。

1

おそらくちょっと変わったでしょう。heredocです。

例:

cat << EOF!! 
blabla 
EOF!! 

注:スクリプトファイルでのみ動作。コマンドラインパーサーは!!を解釈します。

関連する問題