dc 和标准输入或带字符串命令的heredoc?

cta*_*ac_ 4 shell here-document dc

dc可以从文件或/和标准输入中读取命令。
如果我想打印用户输入:

cat essai_dc
[enter a number : ]
n
?
p

dc essai_dc 
  enter a number : 4
  4
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用heredoc

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

enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)

我对标准输入也一样:

cat essai_dc | dc
enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)

命令 ?获取p并执行它,但堆栈为空。
是否有可能让它工作(告诉dc等待输入)

Sté*_*las 6

?从标准输入获取其输入,这是此处的文档here。您需要将脚本提供给dc使用不同的文件描述符。在带有 的系统上/dev/fd/n,这可能是:

dc /dev/fd/3 3<< 'EOF'
[enter a number : ]
n
?
p
EOF
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 ksh 样式的进程替换(通常/dev/fd/n在下面使用):

dc <(cat << 'EOF'
[enter a number : ]
n
?
p
EOF
)
Run Code Online (Sandbox Code Playgroud)

或者取消 here-document 和对(通常)外部cat实用程序的调用:

dc <(printf %s \
'[enter a number : ]
n
?
p
'
)
Run Code Online (Sandbox Code Playgroud)

dc像 GNUdc这样的一些实现允许将dc脚本的内容作为参数传递给-e,因此您可以使用命令替换:

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

或者直接:

dc -e '[enter a number : ]
n
?
p'
Run Code Online (Sandbox Code Playgroud)