Risposte:
echo "some data for the file" >> fileName
sudo sh -c 'echo "some data for the file" >> fileName'
#!/bin/sh
FILE="/path/to/file"
/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.
The keyword EOM can be any text, but it must start the line and be alone.
EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4
EOM
Puoi reindirizzare l'output di un comando su un file:
$ cat file > copy_file
o aggiungere ad esso
$ cat file >> copy_file
Se vuoi scrivere direttamente il comando è echo 'text'
$ echo 'Hello World' > file
sudo sh -c 'cat file > /etc/init/gunicorn.conf'
(grazie al commento di lukaserat sopra)
#!/bin/bash
cat > FILE.txt <<EOF
info code info
info code info
info code info
EOF
cat > FILE.txt
premere Ctrl + D quando hai finito .
So che questa è una dannata domanda, ma dato che l'OP riguarda lo scripting, e per il fatto che google mi ha portato qui, è opportuno menzionare anche l'apertura di descrittori di file per leggere e scrivere contemporaneamente.
#!/bin/bash
# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt
# Let's print some text to fd 3
echo "Roses are red" >&3
echo "Violets are blue" >&3
echo "Poems are cute" >&3
echo "And so are you" >&3
# Close fd 3
exec 3>&-
Quindi cat
il file sul terminale
$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you
Questo esempio fa sì che il file poem.txt sia aperto per la lettura e la scrittura sul descrittore di file 3. Mostra anche che le caselle * nix conoscono più fd quindi solo stdin, stdout e stderr (fd 0,1,2). In realtà tiene molto. Di solito il numero massimo di descrittori di file che il kernel può allocare può essere trovato /proc/sys/file-max
o /proc/sys/fs/file-max
ma usare qualsiasi fd sopra 9 è pericoloso in quanto potrebbe entrare in conflitto con fd usato dalla shell internamente. Quindi non preoccuparti e usa solo fd's 0-9. Se hai bisogno di più di 9 descrittori di file in uno script bash, dovresti comunque usare una lingua diversa :)
Ad ogni modo, i FD possono essere usati in molti modi interessanti.
Mi piace questa risposta:
cat > FILE.txt <<EOF
info code info
...
EOF
ma suggerirei cat >> FILE.txt << EOF
se vuoi semplicemente aggiungere qualcosa alla fine del file senza cancellare ciò che esiste già
Come questo:
cat >> FILE.txt <<EOF
info code info
...
EOF
Sposta il mio commento come risposta, come richiesto da @lycono
Se devi farlo con i privilegi di root, fallo in questo modo:
sudo sh -c 'echo "some data for the file" >> fileName'
echo "some data for the file" | sudo tee -a fileName >/dev/null
a eseguire solo tee
come root.
Per gli ambienti in cui qui i documenti non sono disponibili ( Makefile
, Dockerfile
, ecc) spesso è possibile utilizzare printf
una soluzione ragionevolmente leggibile ed efficiente.
printf '%s\n' '#!/bin/sh' '# Second line' \
'# Third line' \
'# Conveniently mix single and double quotes, too' \
"# Generated $(date)" \
'# ^ the date command executes when the file is generated' \
'for file in *; do' \
' echo "Found $file"' \
'done' >outputfile
Ho pensato che ci fossero alcune risposte perfettamente valide, ma nessun riassunto conciso di tutte le possibilità; in tal modo:
Il principale principale dietro la maggior parte delle risposte qui è il reindirizzamento . Due sono importanti operatori di reindirizzamento per la scrittura su file:
echo 'text to completely overwrite contents of myfile' > myfile
echo 'text to add to end of myfile' >> myfile
Altri citati, piuttosto che da una fonte di input fissa come echo 'text'
, si potrebbe anche scrivere interattivamente su file tramite un "Here Document", che sono anche dettagliati nel link al manuale di bash sopra. Quelle risposte, ad es
cat > FILE.txt <<EOF
o cat >> FILE.txt <<EOF
utilizzare gli stessi operatori di reindirizzamento, ma aggiungere un altro livello tramite "Here Documents". Nella sintassi sopra, scrivi su FILE.txt tramite l'output di cat
. La scrittura ha luogo solo dopo che è stata assegnata una stringa specifica all'ingresso interattivo, in questo caso 'EOF', ma potrebbe trattarsi di qualsiasi stringa, ad esempio:
cat > FILE.txt <<'StopEverything'
o cat >> FILE.txt <<'StopEverything'
funzionerebbe altrettanto bene. Qui i documenti cercano anche vari delimitatori e altri interessanti personaggi di analisi, quindi dai un'occhiata ai documenti per ulteriori informazioni al riguardo.
Un po 'contorto, e più di un esercizio per comprendere sia il reindirizzamento che la sintassi Here Documents, ma potresti combinare la sintassi in stile Here Document con operatori di reindirizzamento standard per diventare una stringa Here:
Reindirizzamento dell'uscita dell'ingresso catcat > myfile <<<'text to completely overwrite contents of myfile'
cat >> myfile <<<'text to completely overwrite contents of myfile'
Puoi anche usare qui document e vi, lo script seguente genera un FILE.txt con 3 righe e interpolazione variabile
VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX
Quindi il file avrà 3 righe come di seguito. "i" è per avviare la modalità di inserimento vi e allo stesso modo per chiudere il file con Esc e ZZ.
#This is my var in text file
var = Test
#Thats end of text file