В сценарии Bash в (set -x) не отображается команда «cat». (его содержание)

в этом сценарии bash .. он просто показывает ..

+cat 

как он работает.

 #!/bin/bash set -x cat > /test << "EOF" a b c d EOF 

но я скорее показываю все, что он делает. в том числе

 a b c d 

что он добавляет в файл.

Попробуйте использовать set -v вместо set -x

Это происходит потому, что set -x отображает оценку расширений, что не является фактором, относящимся к типичным перенаправлениям.

 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. 

Из спецификации POSIX

Операторы перенаправления << и <<- позволяют перенаправлять строки, содержащиеся в файле ввода оболочки, называемом здесь-документом , на ввод команды.

Это cat получает этот вход, а не оболочку. Таким образом, для его отчета нет расширения для отчета перед выполнением. И после того, как он передал этот бит своего ввода, на самом деле нет данных для его отчета в любом случае.

Вот почему – как рекомендуется в другом месте – set -v работает, тогда как -x не делает:

 LC_ALL=C man set | sed -n '/^ *-v/,/^$/p' -v The shell shall write its input to standard error as it is read. 

В этом случае он дублирует свой ввод в stderr во время чтения – перед перенаправлением – расширяет его или нет.

В оболочке нет функциональности для поддержки этого. Вы можете достичь этого конкретного результата, выполнив

 tee /test << "EOF" a b c d EOF 

но это не тривиально адаптируется ко всему, что вы могли бы сделать в сценарии оболочки.

Возможно, вы захотите изучить такие программы, как screen и Expect .