Bash
Qui documenti e qui stringhe
Ricerca…
Rientro qui documenti
È possibile far rientrare il testo all'interno di documenti qui con linguette, è necessario utilizzare il <<-
operatore di redirezione invece di <<
:
$ cat <<- EOF
This is some content indented with tabs `\t`.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
EOF
This is some content indented with tabs _\t_.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
Un caso pratico di utilizzo di questo (come menzionato in man bash
) è negli script di shell, ad esempio:
if cond; then
cat <<- EOF
hello
there
EOF
fi
È consuetudine indentare le righe all'interno di blocchi di codice come in questa istruzione if
, per una migliore leggibilità. Senza la sintassi dell'operatore <<-
, saremmo costretti a scrivere il codice sopra come questo:
if cond; then
cat << EOF
hello
there
EOF
fi
È molto spiacevole leggere, e diventa molto peggio in una sceneggiatura realistica più complessa.
Qui stringhe
Puoi alimentare un comando usando qui stringhe come questa:
$ awk '{print $2}' <<< "hello world - how are you?"
world
$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she
Puoi anche alimentare un ciclo while
con una stringa here:
$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello
Stringhe limite
Un heredoc usa la limitazione per determinare quando smettere di consumare input. La limitrazione di terminazione deve
- Sii all'inizio di una linea.
- Sii l'unico testo sulla linea Nota: se usi
<<-
la limittration può essere preceduta da tabulazioni\t
Corretta:
cat <<limitstring
line 1
line 2
limitstring
Questo produrrà:
line 1 line 2
Uso errato:
cat <<limitstring
line 1
line 2
limitstring
Poiché la limitstring
sull'ultima riga non è esattamente all'inizio della linea, la shell continuerà ad attendere ulteriori input, finché non vedrà una linea che inizia con la limitstring
e non contiene nient'altro. Solo allora smetterà di aspettare input e procede a passare il documento qui al comando cat
.
Si noti che quando si prefissa il limittring iniziale con un trattino, tutte le schede all'inizio della riga vengono rimosse prima dell'analisi, quindi i dati e la stringa limite possono essere rientrati con le schede (per facilitare la lettura negli script della shell).
cat <<-limitstring
line 1 has a tab each before the words line and has
line 2 has two leading tabs
limitstring
produrrà
line 1 has a tab each before the words line and has line 2 has two leading tabs
con le schede iniziali (ma non quelle interne) rimosse.
Crea un file
Un uso classico dei documenti qui è quello di creare un file digitandone il contenuto:
cat > fruits.txt << EOF
apple
orange
lemon
EOF
Il documento qui è le linee tra << EOF
ed EOF
.
Questo documento qui diventa l'input del comando cat
. Il cat
di comando emette semplicemente il suo ingresso, e utilizzando l'operatore di redirezione di uscita >
abbiamo reindirizzare a un file fruits.txt
.
Di conseguenza, il file fruits.txt
conterrà le linee:
apple
orange
lemon
Si applicano le normali regole di reindirizzamento dell'output: se fruits.txt
non esistesse prima, verrà creato. Se esisteva prima, verrà troncato.
Esegui comando con qui documento
ssh -p 21 [email protected] <<EOF
echo 'printing pwd'
echo "\$(pwd)"
ls -a
find '*.txt'
EOF
$
è sfuggito perché non vogliamo che venga espanso dalla shell corrente ovvero $(pwd)
deve essere eseguito sulla shell remota.
Un altro modo:
ssh -p 21 [email protected] <<'EOF'
echo 'printing pwd'
echo "$(pwd)"
ls -a
find '*.txt'
EOF
Nota : l'EOF di chiusura dovrebbe essere all'inizio della riga (senza spazi bianchi prima). Se è richiesto il rientro, è possibile utilizzare le schede se si avvia l'heredoc con <<-
. Vedi gli esempi di Rientro qui e Limiti stringhe per maggiori informazioni.
Esegui diversi comandi con sudo
sudo -s <<EOF
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "\$a"
EOF
-
$a
bisogno di essere sfuggito per evitare che venga espanso dalla shell corrente
O
sudo -s <<'EOF'
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "$a"
EOF