Bash

導出新的環境參數而不輸出到終端

  • March 8, 2022

我正在嘗試執行一個腳本,而當我不希望它輸出文本時,bash 導出正在輸出文本,因為它破壞了輸出。我需要執行一個腳本來提取一些資訊,然後將其插入到下一個命令環境中,有點像獲取 awscli 的 AWS 機密並將它們透明地傳遞到 aws 環境中。我得到不一致的結果,我不確定為什麼

$ ./bin/aws-creds mock
AWS_ACCESS_KEY_ID=mock1234
AWS_SECRET_ACCESS_KEY=mock1234
AWS_CREDS=success

$ ddt aws-creds mock
AWS_ACCESS_KEY_ID=mock1234
AWS_SECRET_ACCESS_KEY=mock1234
AWS_CREDS=success

兩者輸出相等,這很棒,所以讓我們嘗試執行它們並在輸出上使用 export

$ export $(./bin/aws-creds mock)
$ export $(ddt aws-creds mock)
AWS_ACCESS_KEY_ID=mock1234
AWS_SECRET_ACCESS_KEY=mock1234
AWS_CREDS=success
declare -x .... a bunch of extra things from my environment

等一下?這兩個命令在使用子shell $(…) 進行導出時似乎做了不同的事情,這就是我想要解決的問題。我想像第一個 ./bin 腳本一樣,沒有輸出,而是將所有新參數插入到 shells 環境中。看起來我寫的腳本’ddt’由於某種原因不能以同樣的方式工作。

任何人都可以解釋原因並提出一些解決方法嗎?

$$ Expanded from comments: $$該ddt命令將其輸出發送到標準錯誤 (stderr) 而不是標準輸出 (stdout),並且$( )只擷取標準輸出。基本上有兩種方法可以解決這個問題:

  1. 更好的選擇是修復ddt,以便將變數值發送到 stdout 而不是 stderr。
  2. 如果這不可能,您可以2>&1ddt命令之後添加,將其標準錯誤重定向到標準輸出(並允許$( )擷取它)。但這存在風險,如果ddt列印任何實際錯誤,它會繼續嘗試export這些消息,結果不可預測(並且可能是不希望的)。

請參閱Stackoverflow 上的“輸出未在 bash 變數中擷取”問題

引用自:https://serverfault.com/questions/1095672