![在第二个管道的括号赋值内读取标准输入的正确方法是什么](https://linux22.com/image/89224/%E5%9C%A8%E7%AC%AC%E4%BA%8C%E4%B8%AA%E7%AE%A1%E9%81%93%E7%9A%84%E6%8B%AC%E5%8F%B7%E8%B5%8B%E5%80%BC%E5%86%85%E8%AF%BB%E5%8F%96%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E7%9A%84%E6%AD%A3%E7%A1%AE%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88.png)
第一种样式,要分配的第 2 组管道,这有效:
$ myresult1=$(curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' 2>/dev/null | jq '.archived_snapshots.closest.url'); echo "$myresult1"
"http://web.archive.org/web/20160622184546/http://stackoverflow.com/"
第二种样式,仅在第二个管道中分配,这不起作用:
$ curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' 2>/dev/null | myresult2=$(jq '.archived_snapshots.closest.url'); echo "$myresult2"
$
所以我想知道是否可以使第二种风格工作,即我是否可以在括号赋值内读取标准输入。
答案1
您的第二个命令有效,问题是您正在使用bash
或任何将所有管道组件放入子 shell 中的 shell。myresult2
已正确设置,但变量立即超出范围,除非您停留在相同的子 shell 中,如下所示:
curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' \
2>/dev/null | {
myresult2=$(jq '.archived_snapshots.closest.url'); echo "$myresult2" ; }
如果您在 下运行此命令ksh
,变量分配将在最顶层 shell 中完成,因此将按预期工作。
或者,您可以设置 lastpipe 选项以获取ksh
以下行为bash
:
shopt -s lastpipe
如果您希望它在交互式会话中工作,您还应该禁用作业控制:
set +m