LinuxシェルスクリプトのHeredocでは、日付コマンドは印刷されません。

LinuxシェルスクリプトのHeredocでは、日付コマンドは印刷されません。

区切り文書内で日付を印刷したいシェルスクリプトがあります。以下はコードの断片です。

echo "This is a text"
echo I want date to print inside heredoc <<EOF
var1=`date`
echo $var1
EOF
echo "Thats All"

上記のコードの出力は次のとおりです。

I want date to print inside heredoc
Thats All

日付を印刷しません。 echoコマンドを入力しても印刷されません。ここに何か問題があるかもしれません。

注:ここのコードに次のものを追加しようとしました。___EOF - 機能しない 'EOF' - 機能しない

提案してください。

これは他のユーザーに切り替えて、そこでいくつかの操作を実行する必要があるときの実際のコードです。

su - oracle << EOF
echo $(xyz file.prop) > replace.txt
var1=`cat replace.txt_orig`
var2=`cat replace.txt`

echo $var1
echo $var2
EOF

変数の割り当てとエコーはここでは何の影響もありません。

答え1

Heredocsは、ファイル記述子が指定されていない限りSTDINとして読み取られますが、echostdin(またはfd)では読み込まれません。

さらに、コマンド置換とパラメータ拡張は区切り文書内で機能しますが(単語に引用符がない限り<< WORD)、変数の割り当ては機能せず、文書外ではコマンド置換も機能しません。

ここで最終的に達成したいことが何であるかよくわかりません。 XYの問題のようですが、catこれを使ってheredocを読むことができ、期待どおりに動作します。

var1=$(date)
cat <<EOF
$var1
EOF

または簡単に:

cat <<EOF
$(date)
EOF

答え2

xyz出力として生成する前にコマンドの結果やファイルの内容を変数として読み込む必要がないため、このドキュメントでは変数の割り当てやコマンドの置き換えは不要です。

su - oracle <<'END_SU_SCRIPT'
xyz file.prop >replace.txt
cat replace.txt_orig
cat replace.txt
END_SU_SCRIPT

シェルを呼び出すのに必要な拡張機能がないため、ここで参照されているドキュメントを使用することにしました。

ドキュメントのシェル拡張はここで元のドキュメントの問題でした。ここではドキュメントが引用されていないため、シェルを呼び出すと、二重引用符で囲まれた文字列であるかのように、ドキュメントのすべての拡張が拡張されます。したがって、コマンド置換はaroundおよび変数$(xyz file.prop)置換と同様に拡張されます。これはすべて起こります。cat$var1$var2今後電話もかけてみてくださいsu

関連情報