在第二個管道的括號賦值內讀取標準輸入的正確方法是什麼

在第二個管道的括號賦值內讀取標準輸入的正確方法是什麼

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

相關內容