Quero imprimir o código em um arquivo usando 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
mas quando eu verifico a saída do arquivo, recebo o seguinte:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Tentei colocar aspas simples, mas a saída também traz as aspas simples. Como posso evitar esse problema?
#!/bin/bash
e nada mais -#!
isso é o que a torna uma linha shebang válida, e o que vem depois dela é o caminho para o intérprete.man bash
e pesquiseHere Documents
. Todos os detalhes aí.$(command)
vez de`command`
. Para obter o conteúdo de um arquivo, o Bash tem$(<file)
Respostas:
Você só precisa de uma mudança mínima; apóie o delimitador here-document após
<<
.ou de forma equivalente barra invertida com escape:
Sem citar, o aqui documento sofrerá substituição de variáveis, crases serão avaliados, etc, como você descobriu.
Se você precisar expandir alguns, mas não todos os valores, será necessário escapar individualmente daqueles que deseja evitar.
vai produzir
Conforme sugerido por @fedorqui , aqui está a seção relevante de
man bash
:fonte
Ou, usando seus marcadores EOF, você precisa citar o marcador inicial para que a expansão não seja feita:
IHTH
fonte
Isso deve funcionar, eu apenas testei e funcionou como esperado: nenhuma expansão, substituição ou o que quer que tenha ocorrido.
Usar o seguinte também funciona.
Além disso, é importante notar que ao usar heredocs,
<< EOF
como ocorre a substituição e expansão de variável e semelhantes. Então, fazer algo assim:sempre resultará na expansão das variáveis
$HOME
e$PWD
. Portanto, se o seu diretório pessoal for/home/foobar
e o caminho atual for/home/foobar/bin
,file
será semelhante a:em vez do esperado:
fonte
<<<
estão disponíveis apenas a partir do Bash 3, e não são portáveis para outros shells.<<<
também está disponível em Zsh