Come posso scrivere un documento qui su un file nello script Bash?
Come posso scrivere un documento qui su un file nello script Bash?
Risposte:
Leggi la Guida avanzata agli script di Bash, capitolo 19. Qui, documenti .
Ecco un esempio che scriverà il contenuto in un file su /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Si noti che l'ultimo 'EOF' (The LimitString
) non dovrebbe avere spazi bianchi davanti alla parola, perché significa che ilLimitString
non verrà riconosciuto.
In uno script di shell, potresti voler usare il rientro per rendere leggibile il codice, tuttavia ciò può avere l'effetto indesiderato di indentare il testo all'interno del tuo documento qui. In questo caso, utilizzare <<-
(seguito da un trattino) per disabilitare le schede iniziali (si noti che per verificare ciò è necessario sostituire lo spazio bianco iniziale con un carattere di tabulazione , poiché qui non è possibile stampare caratteri di tabulazione effettivi).
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Se non vuoi interpretare le variabili nel testo, usa le virgolette singole:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Per convogliare l'ereditarietà attraverso una pipeline di comandi:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
Produzione:
foo
bbr
bbz
... o per scrivere l'ereditarietà in un file usando sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
<<<
, come si chiamano?
<<<
sono chiamati 'Here Strings'. Codice come tr a-z A-Z <<< 'one two three'
si tradurrà nella stringa ONE TWO THREE
. Maggiori informazioni su en.wikipedia.org/wiki/Here_document#Here_strings
<<'EOF'
piuttosto che <<EOF
.
Invece di utilizzare cat
e il reindirizzamento I / O potrebbe essere utile utilizzare tee
invece:
tee newfile <<EOF
line 1
line 2
line 3
EOF
È più conciso, inoltre a differenza dell'operatore di reindirizzamento con cui può essere combinato sudo
se è necessario scrivere su file con permessi di root.
> /dev/null
alla fine della prima riga per evitare che il contenuto del file qui venga visualizzato su stdout quando viene creato.
sudo
, piuttosto che per la sua brevità :-)
man tee
. Utilizzare il -a
flag per aggiungere anziché sovrascrivere.
Nota:
La domanda (come scrivere un documento qui (aka heredoc ) in un file in uno script bash?) Ha (almeno) 3 principali dimensioni o domande secondarie indipendenti:
root
) possiede il file?(Ci sono altre dimensioni / domande secondarie che non considero importanti. Prendi in considerazione la modifica di questa risposta per aggiungerle!) Ecco alcune delle combinazioni più importanti delle dimensioni della domanda sopra elencate, con vari identificatori di delimitazione diversi - non c'è nulla sacro EOF
, assicurati solo che la stringa che usi come identificatore di delimitazione non si verifichi all'interno della tua eredità:
Per sovrascrivere un file esistente (o scrivere in un nuovo file) di tua proprietà, sostituendo i riferimenti alle variabili all'interno dell'ereditarietà:
cat << EOF > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
EOF
Per aggiungere un file esistente (o scrivere in un nuovo file) di tua proprietà, sostituendo i riferimenti alle variabili all'interno dell'ereditarietà:
cat << FOE >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
FOE
Per sovrascrivere un file esistente (o scrivere in un nuovo file) di tua proprietà, con i contenuti letterali dell'ereditarietà:
cat << 'END_OF_FILE' > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
END_OF_FILE
Per aggiungere un file esistente (o scrivere in un nuovo file) di tua proprietà, con i contenuti letterali dell'ereditarietà:
cat << 'eof' >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
eof
Per sovrascrivere un file esistente (o scrivere in un nuovo file) di proprietà di root, sostituendo i riferimenti alle variabili all'interno dell'ereditarietà:
cat << until_it_ends | sudo tee /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
until_it_ends
Per aggiungere un file esistente (o scrivere in un nuovo file) di proprietà di user = foo, con i contenuti letterali dell'ereditarietà:
cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
Screw_you_Foo
-a
== --append
; cioè, tee -a
-> tee
. Vedi info tee
(lo
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
anziché EOF
nell'esempio di append?
Per costruire sulla risposta di @ Livven , ecco alcune utili combinazioni.
sostituzione variabile, scheda iniziale mantenuta, sovrascrivi file, eco a stdout
tee /path/to/file <<EOF
${variable}
EOF
nessuna sostituzione variabile , scheda iniziale mantenuta, sovrascrivi file, eco a stdout
tee /path/to/file <<'EOF'
${variable}
EOF
sostituzione variabile, tabulazione rimossa , sovrascrivi file, eco a stdout
tee /path/to/file <<-EOF
${variable}
EOF
sostituzione variabile, scheda iniziale mantenuta, aggiunta a file , eco a stdout
tee -a /path/to/file <<EOF
${variable}
EOF
sostituzione variabile, scheda iniziale mantenuta, sovrascrivi file, nessuna eco allo stdout
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
quanto sopra può essere combinato con sudo
pure
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Quando sono necessarie le autorizzazioni di root per il file di destinazione, utilizzare |sudo tee
invece di >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Per le persone future che potrebbero avere questo problema ha funzionato il seguente formato:
(cat <<- _EOF_
LogFile /var/log/clamd.log
LogTime yes
DatabaseDirectory /var/lib/clamav
LocalSocket /tmp/clamd.socket
TCPAddr 127.0.0.1
SelfCheck 1020
ScanPDF yes
_EOF_
) > /etc/clamd.conf
cat << END > afile
seguite dall'eredità funziona perfettamente.
cat
come mostrato nella risposta accettata.
cat
viene eseguito all'interno di una subshell e tutto l'output della subshell viene reindirizzato al file
Ad esempio puoi usarlo:
Primo (fare una connessione ssh):
while read pass port user ip files directs; do
sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
done <<____HERE
PASS PORT USER IP FILES DIRECTS
. . . . . .
. . . . . .
. . . . . .
PASS PORT USER IP FILES DIRECTS
____HERE
Secondo (esecuzione comandi):
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE
Terzo (esecuzione dei comandi):
Script=$'
#Your commands
'
while read pass port user ip; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"
done <<___HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
___HERE
Avanti (usando le variabili):
while read pass port user ip fileoutput; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
#Your command > $fileinput
#Your command > $fileinput
ENDSSH1
done <<____HERE
PASS PORT USER IP FILE-OUTPUT
. . . . .
. . . . .
. . . . .
PASS PORT USER IP FILE-OUTPUT
____HERE