![dc 和标准输入或带有字符串命令的heredoc?](https://linux22.com/image/14310/dc%20%E5%92%8C%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E6%88%96%E5%B8%A6%E6%9C%89%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%91%BD%E4%BB%A4%E7%9A%84heredoc%EF%BC%9F.png)
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'