Escrevendo comandos para um arquivo a partir de um shell script

1

Eu quero escrever algumas linhas de comandos para um arquivo, mas alguns comandos escritos em $(...) estão sendo avaliados. Quero que $(...) seja preservado.

Eu tentei seguir:

cat > .git/hooks/pre-commit << EOM
#Colors
RED='3[0;31m'
NC='3[0m' # No Color

# Javascript unit tests 
res=$(script -q /dev/null ./tests/hooks/non-ui-test-hook )
RESULT=$?
[ $RESULT -ne 0 ] && echo -e "$res" && exit 1
echo -e "All test cases passed.\n"
exit 0
EOM

Ele escreve no arquivo seguindo o conteúdo:

#Colors
RED='3[0;31m'
NC='3[0m' # No Color

# Javascript unit tests
res=Warning: Could not find any test files matching pattern: test
No test files found
RESULT=1
[  -ne 0 ] && echo -e "" && exit 1
echo -e "All test cases passed.\n"
exit 0

Como posso preservar $(...) no arquivo de saída?

    
por chandil03 06.06.2017 / 15:39

2 respostas

4

Você pode alternativamente escapar de $ :

$(...)
$

no seu código:

cat > .git/hooks/pre-commit << EOM
#Colors
RED='3[0;31m'
NC='3[0m' # No Color

# Javascript unit tests 
res=$(script -q /dev/null ./tests/hooks/non-ui-test-hook )
RESULT=$?
[ $RESULT -ne 0 ] && echo -e "$res" && exit 1
echo -e "All test cases passed.\n"
exit 0
EOM
    
por Ravexina 06.06.2017 / 15:46
2

Cite o indicador final do documento here, EOM no seu caso:

cat > .git/hooks/pre-commit << 'EOM'
...
...
EOM

Escapar usando aspas duplas ou contrabarra também:

cat > .git/hooks/pre-commit << "EOM"
...
...
EOM

Ou

cat > .git/hooks/pre-commit << \EOM
...
...
EOM

Você pode não ter percebido, mas RESULT=$? também foi expandido para RESULT=1 , ou seja, o status de saída de script... dentro da substituição do comando.

Apenas para completar, se você quer que alguma expansão aconteça, mas não outras, você precisa seguir o que você tem atualmente e escapar do que você quer preservar com métodos típicos de escape.

    
por heemayl 06.06.2017 / 15:43