(set -x)モードのBashスクリプトは、「cat」コマンドの機能を表示しません。 (内容)

(set -x)モードのBashスクリプトは、「cat」コマンドの機能を表示しません。 (内容)

このbashスクリプトでは..だけが表示されます..

    +cat

実行するとき。

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

しかし、私はそれが何であるかを見せたいです。含む

a
b
c
d

ファイルに追加されます。

答え1

set -v代わりに試してみてくださいset -x

答え2

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拡張の有無にかかわらず、リダイレクトする前に読み取った入力をコピーします。

答え3

シェルにはこの操作をサポートする機能はありません。あなたはこの目標を達成することができます特定結果

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

ただし、これがシェルスクリプトで実行できるすべての操作に完全に適用されるわけではありません。

screenのようなプログラムを見たいと思うかもしれませんExpect

関連情報