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

2.05b

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow