O script Bash no modo (set -x) não exibe o comando “cat”. (conteúdos disto)

1

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.

    
por user82418 29.08.2014 / 16:15

3 respostas

3

Tente usar set -v em vez do set -x

    
por 29.08.2014 / 16:23
2

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.

Da especificação POSIX

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.

    
por 30.08.2014 / 04:03
1

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 .

    
por 29.08.2014 / 16:22