Comment cat <<EOF >> un fichier contenant du code?
Je veux imprimer le code dans un fichier à l'aide de 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 lorsque je vérifie le fichier de sortie, 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 porte également les guillemets simples avec elle. Comment puis-je éviter ce problème?
- Vous devez également fixer le shebang. La première ligne doit être littéralement
#!/bin/bash
et rien d'autre -- le#!
est ce qu'il fait dans un valide ligne shebang, et ce qui vient après c'est le chemin vers l'interpréteur. - voir
man bash
, et la recherche deHere Documents
. Tous les détails. - Comme un retard de côté, la syntaxe moderne pour le processus de substitution est
$(command)
au lieu de`command`
. Pour obtenir le contenu d'un fichier, Bash a$(<file)
Vous devez vous connecter pour publier un commentaire.
Vous avez seulement besoin d'un changement minime; la citation de l'ici-document délimiteur après
<<
.ou de manière équivalente, l'anti-slash-y échapper:
Sans le citer, le document va subir une substitution de variable, backticks seront évalués, etc, comme vous l'avez découvert.
Si vous avez besoin de développer certains, mais pas tous, des valeurs, vous avez besoin d'échapper à ceux que vous voulez éviter.
produira
Comme suggéré par @fedorqui, voici la section pertinente de
man bash
:Ou, à l'aide de votre EOF marqueurs, vous devez citer la première marqueur afin d'extension ne peut pas être réalisé:
IHTH
Cela devrait fonctionner, je viens de tester et cela a fonctionné comme prévu: pas d'expansion, de substitution, ou quoi avez-vous a eu lieu.
À l'aide de la suite fonctionne également.
Aussi, il est intéressant de noter que lors de l'utilisation de heredocs, comme
<< EOF
, la substitution et l'expansion des variables et l'envie de prend de la place. Afin de faire quelque chose comme ceci:entraînera toujours l'expansion des variables
$HOME
et$PWD
. Donc, si votre répertoire est/home/foobar
et le chemin d'accès actuel est/home/foobar/bin
,file
ressemblera à ceci:à la place de l':
<<<
sont disponibles uniquement à partir de Bash 3, et pas de portable à d'autres coquilles.<<<
est également disponible dans Zsh