この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
。