第一种样式,要分配的第 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