在第二个管道的括号赋值内读取标准输入的正确方法是什么

在第二个管道的括号赋值内读取标准输入的正确方法是什么

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

相关内容