Tente usar set -v
em vez do set -x
neste script bash .. ele simplesmente mostra ..
+cat
enquanto é executado.
#!/bin/bash
set -x
cat > /test << "EOF"
a
b
c
d
EOF
mas eu prefiro mostrar tudo o que faz. incluindo o
a
b
c
d
que é adicionado a um arquivo.
Isso ocorre porque set -x
exibe a avaliação das expansões - o que não é um fator relacionado aos redirecionamentos típicos.
LC_ALL=C man set |
sed -n '/^ *-x/,/^$/p'
-x The shell shall write to standard error a
trace for each command after it expands the
command and before it executes it. It is
unspecified whether the command that turns
tracing off is traced.
The redirection operators
<<
and<<-
both allow redirection of lines contained in a shell input file, known as a here-document, to the input of a command.
É cat
que recebe essa entrada - não o shell. Portanto, não há expansão para relatar antes da execução. E, depois de ter entregue esse bit de sua entrada, não há dados para ele relatar de qualquer maneira.
É por isso que - como é recomendado em outros lugares set -v
funciona enquanto -x
não:
LC_ALL=C man set |
sed -n '/^ *-v/,/^$/p'
-v The shell shall write its input to standard
error as it is read.
Nesse caso, ele duplica sua entrada para stderr
ao lê-lo - antes dos redirecionamentos - se ele é expandido ou não.
Não há funcionalidade no shell para suportar isso. Você poderia alcançar este resultado específico fazendo
tee /test << "EOF"
a
b
c
d
EOF
mas isso não é facilmente adaptável a tudo que você poderia fazer em um shell script.
Você pode querer procurar programas como screen
e Expect
.
Tags debugging bash shell-script