
第一種樣式,要指派的第 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