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

dc 和标准输入或带有字符串命令的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'

相关内容