2013-08-30 19 views
11

C'è un comando che non capisco:Cos'è EOF !! nello script di bash?

custom_command << EOF!! 

voglio chiedere cosa EOF !! è nello script di bash. Ho trovato EOF con google, ma Google ignorerà il "!!" automaticamente, quindi non riesco a trovare EOF !!.

Conosco la fine del token del file, ma non so esattamente cosa significhi con "!!" nella sceneggiatura È un marchio per forzare qualcosa a fare qualcosa come nel wim di vim! ?

Inoltre, perché e quando dovremmo usare EOF !! invece di EOF?

+0

È "Fine del file" – Juangcg

+2

http: //webapps.stackexchange.com/q/1479; non che ti possa aiutare qui ... – Ben

+1

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

risposta

15

Sulla riga di comando, !! verrebbe espanso all'ultimo comando eseguito. Bash stampare la linea per voi:

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

In uno script, però, l'espansione della cronologia è disabilitato di default, in modo che i punti esclamativi sono parte della parola.

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

produce:

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 

Per attivare la storia e l'espansione della cronologia in uno script, aggiungere le seguenti righe:

set -o history 
set -H 
-1

The bash manual elenchi questo sotto "Event designators", dicendo:

!!

fare riferimento al comando precedente. Questo è un sinonimo di! -1`.

Ho semplicemente cercato "bash manuale doppia esclamazione".

4

È possibile utilizzare qualsiasi stringa come terminatore del documento qui.

EOF!! è proprio ciò che la persona che ha scritto la sceneggiatura ha deciso di utilizzare.

+0

No, in bash 'EOF !!' sarà sostituito da 'EOF ' – knittl

+2

@knittl Non lo farà, '!!' viene sostituito solo in script interattivi. – jlliagre

+1

Giusto. L'espansione della cronologia non è abilitata in modalità non interattiva per impostazione predefinita. +1. – devnull

0

Come altri già scritto, questo è un qui-documento.

Il token utilizzato deve essere scelto con cura; poiché la probabilità che il documento qui presente sia EOF!! sia inferiore a quella dello stesso EOF, è stato scelto.

Suppongo che abbiano verificato che non danneggiano prima di utilizzarlo; !! in uno script NON fa riferimento alla cronologia, ma rimane così com'è.

1

Probabilmente è solo uno strano heredoc.

Esempio:

cat << EOF!! 
blabla 
EOF!! 

Nota: questo funziona solo in file di script. Il parser della riga di comando interpreta !!.