將heredoc與管道結合失敗

將heredoc與管道結合失敗

我正在嘗試使用curl 登入API。因為請求需要 JSON,所以我使用這個:

curl -s -X POST -H "Content-Type: application/json" \
    $API_URL/auth -d@- <<EOF
{
  "id": "[email protected]",
  "password": "!password!"
}
EOF

……而且效果很好。我得到的結果看起來像這樣:

{"access_token":"jXed...I5mQ=","expires_in":3600}

但是當我嘗試捕獲變數中的輸出時,它不起作用。

我試過了:

x=$(curl ...)

……但是失敗了bash: !password!: event not found

是的,我的密碼!以;開頭這是 API 的測試安裝,因此我使用弱密碼。

我知道如果我使用set +H或從腳本運行它,bash 不會對!.我的問題是:

  1. 我偶爾想將腳本複製並貼上到命令行中。六個月後,我就會忘記這條皺紋。
  2. 為什麼 bash 甚至嘗試在定界文件中執行此操作?

由於上述的奇怪之處!,我嘗試將結果透過管道傳輸到read

(curl ...
EOF
) | read x

……但隨後它以某種方式破壞了定界文檔,並且伺服器以相當於“無效 JSON”的方式進行響應。

順便說一句,如果我使用cat而不是curl,則定界文檔似乎是空的。

答案1

為了避免該錯誤,只需在腳本中event not found使用, 即可。set +H它是無害的,你可以添加評論來解釋它。

| read x根本行不通;看http://tiswww.case.edu/php/chet/bash/FAQ, 具體來說:

E4) 如果我將命令的輸出透過管道傳輸到「讀取變數」中,為什麼當讀取命令完成時輸出不會顯示在 $variable 中?

在 bash 中,在子 shell 中| foo運行。foo它無法更改父 shell 中的變數。

代替使用x=$(whatever)

相關內容