Je souhaite imprimer du code dans un fichier en utilisant cat <<EOF >>
:
cat <<EOF >> brightup.sh
!/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
EOF
mais quand je vérifie la sortie du fichier, j'obtiens ceci:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
J'ai essayé de mettre des guillemets simples, mais la sortie contient également les guillemets simples. Comment éviter ce problème?
#!/bin/bash
et rien d'autre -#!
c'est ce qui en fait une ligne shebang valide, et ce qui vient après est le chemin vers l'interpréteur.man bash
et rechercherHere Documents
. Tous les détails ici.$(command)
au lieu de`command`
. Pour obtenir le contenu d'un fichier, Bash a$(<file)
Réponses:
Vous n'avez besoin que d'un changement minime; guillemet simple le délimiteur ici-document après
<<
.ou de manière équivalente contre la barre oblique inverse:
Sans les guillemets, le document ici subira une substitution de variables, les 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.
produira
Comme suggéré par @fedorqui , voici la section pertinente de
man bash
:la source
Ou, en utilisant vos marqueurs EOF, vous devez citer le marqueur initial pour que l'expansion ne soit pas effectuée:
IHTH
la source
Cela devrait fonctionner, je viens de le tester et cela a fonctionné comme prévu: aucune expansion, substitution ou autre chose n'a eu lieu.
L'utilisation de ce qui suit fonctionne également.
En outre, il convient de noter que lors de l'utilisation d'heredocs, tels que la
<< EOF
substitution et l'expansion de variables, etc. Alors faites quelque chose comme ça: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:au lieu de l'attendu:
la source
<<<
ne sont disponibles qu'à partir de Bash 3, et ne sont pas portables vers d'autres shells.<<<
est aussi disponible dans Zsh