GNU/Linux >> Tutoriels Linux >  >> Linux

Comment cat <<EOF>> un fichier contenant du code ?

Cela devrait fonctionner, je viens de le tester et cela a fonctionné comme prévu :aucune extension, substitution ou autre n'a eu lieu.

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. 

L'utilisation de ce qui suit fonctionne également.

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

En outre, il convient de noter que lors de l'utilisation d'heredocs, tels que << EOF , la substitution et l'expansion variable et similaires ont lieu. Donc, faites quelque chose comme ça :

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

entraînera toujours l'expansion des variables $HOME et $PWD . Donc, si votre répertoire personnel est /home/foobar et le chemin actuel est /home/foobar/bin , file ressemblera à ceci :

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

au lieu de l'attendu :

cd "$HOME"
echo "$PWD"

Vous n'avez besoin que d'un changement minimal; mettez entre guillemets le délimiteur here-document après << .

cat <<'EOF' >> brightup.sh

ou de manière équivalente, échappez-le par une barre oblique inverse :

cat <<\EOF >>brightup.sh

Sans guillemets, le document ici subira une substitution de variable, des backticks seront évalués, etc., comme vous l'avez découvert.

Si vous devez développer certaines valeurs, mais pas toutes, vous devez échapper individuellement celles que vous souhaitez empêcher.

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

produira

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

Comme suggéré par @fedorqui, voici la section pertinente de man bash :

Voici Documents

Ce type de redirection demande au shell de lire l'entrée de la source actuelle jusqu'à ce qu'une ligne contenant uniquement un délimiteur (sans espaces de fin) soit vue. Toutes les lignes lues jusque-là sont alors utilisées comme entrée standard pour une commande.

Le format des documents ici est :

      <<[-]word
              here-document
      delimiter

Aucune extension de paramètre, substitution de commande, extension arithmétique ou extension de nom de chemin n'est effectuée sur le mot. Si des caractères dans word sont entre guillemets, le délimiteur est le résultat de la suppression des guillemets sur word, et les lignes du document ici ne sont pas développées. Si le mot n'est pas entre guillemets, toutes les lignes du document ici sont soumises à l'expansion des paramètres, à la substitution de commande et à l'expansion arithmétique . Dans ce dernier cas, la suite de caractères \<newline> est ignoré, et \ doit être utilisé pour citer les caractères \ , $ , et ` .


Linux
  1. Comment cat << EOF fonctionne-t-il dans bash?

  2. Comment rendre le fichier clairsemé?

  3. Comment trier un fichier sur place

  4. Comment puis-je cater un fichier et supprimer les lignes commentées ?

  5. Comment copier un fichier de manière transactionnelle ?

Comment créer un fichier Tar Gz

Comment décompresser (ouvrir) le fichier Gz

Comment créer un fichier sous Linux à l'aide de la commande Cat

Comment créer un lien symbolique vers un fichier sous Linux

Comment faire écho dans le fichier

Comment modifier le code HTML dans cPanel