GNU/Linux >> Linux Esercitazione >  >> Linux

Come cat <<EOF >> un file contenente codice?

Dovrebbe funzionare, l'ho appena provato e ha funzionato come previsto:nessuna espansione, sostituzione o altro.

cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
  curr=$((curr+406));
  echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want. 

Anche l'uso di quanto segue funziona.

cat <<< ' > file
 ... code ...'

Inoltre, vale la pena notare che quando si utilizzano heredoc, come << EOF , sostituzione ed espansione variabile e simili hanno luogo. Quindi, facendo qualcosa del genere:

cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF

risulterà sempre nell'espansione delle variabili $HOME e $PWD . Quindi se la tua home directory è /home/foobar e il percorso corrente è /home/foobar/bin , file avrà questo aspetto:

cd "/home/foobar"
echo "/home/foobar/bin"

invece del previsto:

cd "$HOME"
echo "$PWD"

Hai solo bisogno di un cambiamento minimo; virgoletta singola il delimitatore here-document dopo << .

cat <<'EOF' >> brightup.sh

o equivalentemente barra rovesciata:

cat <<\EOF >>brightup.sh

Senza virgolette, il documento here subirà la sostituzione di variabili, gli apici inversi saranno valutati, ecc., come hai scoperto.

Se devi espandere alcuni valori, ma non tutti, devi eseguire l'escape individualmente a quelli che desideri impedire.

cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

produrrà

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

Come suggerito da @fedorqui, ecco la relativa sezione da man bash :

Qui Documenti

Questo tipo di reindirizzamento istruisce la shell a leggere l'input dalla sorgente corrente finché non viene vista una riga contenente solo un delimitatore (senza spazi vuoti). Tutte le righe lette fino a quel punto vengono quindi utilizzate come input standard per un comando.

Il formato degli here-documents è:

      <<[-]word
              here-document
      delimiter

Nessuna espansione di parametro, sostituzione di comando, espansione aritmetica o espansione di percorso viene eseguita su word. Se dei caratteri in word sono quotati, il delimitatore è il risultato della rimozione delle virgolette su word e le righe nel documento qui non vengono espanse. Se la parola non è quotata, tutte le righe dell'here-document sono soggette a espansione di parametri, sostituzione di comandi ed espansione aritmetica . In quest'ultimo caso, la sequenza di caratteri \<newline> viene ignorato e \ deve essere utilizzato per citare i caratteri \ , $ e ` .


Linux
  1. Come rendere il file sparse?

  2. Come grep \n nel file

  3. Come ordinare un file sul posto

  4. Come posso cat un file e rimuovere le righe commentate?

  5. Come copiare un file in modo transazionale?

Come creare file Tar Gz

Come decomprimere (aprire) il file Gz

Come creare un file in Linux usando Cat Command

Come collegare simbolicamente un file in Linux

Come fare eco in un file

Come modificare il codice HTML in cPanel