文字列コマンドを使用するdcとstdinまたはheredoc?

文字列コマンドを使用するdcとstdinまたはheredoc?

dcコマンドはファイルまたは標準入力から読み取ることができます。
ユーザー入力を印刷するには、次のようにします。

cat essai_dc
[enter a number : ]
n
?
p

dc essai_dc 
  enter a number : 4
  4

今、私は以下を使用しようとするとheredoc

dc <<EOF
> [enter a number : ]
> n
> ?
> p
> EOF  

enter a number : dc: stack empty

標準入力と同じ結果が得られます。

cat essai_dc | dc
enter a number : dc: stack empty

注文する?それをインポートしてp実行しましたが、スタックは空です。
動作させることは可能ですか(dc入力を待つと言ってください)

答え1

?標準入力から入力を受け取る方法は次のとおりです。文書は次のとおりです。dcスクリプトを提供するには、別のファイル記述子を使用する必要があります。以下を含むシステム/dev/fd/n

dc /dev/fd/3 3<< 'EOF'
[enter a number : ]
n
?
p
EOF

あるいは、kshスタイルのプロセス置換を使用することもできます(/dev/fd/n以下で一般的に使用されます)。

dc <(cat << 'EOF'
[enter a number : ]
n
?
p
EOF
)

または、ここで文書をキャンセルしcat(通常)外部ユーティリティを呼び出します。

dc <(printf %s \
'[enter a number : ]
n
?
p
'
)

一部のdc実装(GNUなど)では、スクリプトの内容を引数として渡すことdcができるため、コマンド置換を使用できます。dc-e

dc -e "$(cat << 'EOF'
[enter a number : ]
n
?
p
EOF
)"

または直接:

dc -e '[enter a number : ]
n
?
p'

関連情報