GNU/Linux >> Znalost Linux >  >> Linux

Jak kat <<EOF >> soubor obsahující kód?

To by mělo fungovat, právě jsem to otestoval a fungovalo to podle očekávání:neproběhlo žádné rozšíření, nahrazení nebo co-máte.

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. 

Funguje také použití následujícího.

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

Také stojí za zmínku, že při použití heredocs, jako je << EOF probíhá substituce a variabilní expanze a podobně. Takže uděláte něco takového:

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

vždy povede k rozšíření proměnných $HOME a $PWD . Pokud je tedy váš domovský adresář /home/foobar a aktuální cesta je /home/foobar/bin , file bude vypadat takto:

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

místo očekávaného:

cd "$HOME"
echo "$PWD"

Potřebujete jen minimální změnu; oddělovač dokumentu zde za << uveď do jednoduchých uvozovek .

cat <<'EOF' >> brightup.sh

nebo ekvivalentně zpětné lomítko-escape it:

cat <<\EOF >>brightup.sh

Bez uvozovek bude tento dokument podroben variabilní substituci, budou vyhodnoceny zpětné zaškrtnutí atd., jak jste objevili.

Pokud potřebujete rozšířit některé, ale ne všechny hodnoty, musíte jednotlivě uniknout těm, kterým chcete zabránit.

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

vyrobí

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

Jak navrhuje @fedorqui, zde je relevantní sekce z man bash :

Zde Dokumenty

Tento typ přesměrování instruuje shell, aby četl vstup z aktuálního zdroje, dokud není vidět řádek obsahující pouze oddělovač (s mezerami na konci). Všechny řádky přečtené do tohoto bodu jsou pak použity jako standardní vstup pro příkaz.

Formát dokumentů zde je:

      <<[-]word
              here-document
      delimiter

Ve wordu se neprovádí žádné rozšiřování parametrů, substituce příkazů, aritmetické rozšiřování ani rozšiřování názvu cesty. Pokud jsou nějaké znaky ve wordu uvedeny v uvozovkách, oddělovač je výsledkem odstranění uvozovek ve wordu a řádky v tomto dokumentu nejsou rozbaleny. Pokud slovo není v uvozovkách, všechny řádky tohoto dokumentu podléhají rozšíření parametrů, substituci příkazů a aritmetickému rozšíření . V druhém případě sekvence znaků \<newline> je ignorováno a \ musí být použito k uvozování znaků \ , $ a ` .


Linux
  1. Jak funguje cat << EOF v bash?

  2. Jak udělat soubor řídký?

  3. Jak grep \nv souboru

  1. Jak přesunout 100 souborů ze složky obsahující tisíce?

  2. Jak vykopat soubor z Awk?

  3. Jak třídit soubor na místě

  1. Jak změnit název souboru obsahujícího znaky?

  2. Jak mohu kat soubor a odstranit komentované řádky?

  3. Jak transakčně zkopírovat soubor?