Bash
導出新的環境參數而不輸出到終端
我正在嘗試執行一個腳本,而當我不希望它輸出文本時,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),並且$( )
只擷取標準輸出。基本上有兩種方法可以解決這個問題:
- 更好的選擇是修復
ddt
,以便將變數值發送到 stdout 而不是 stderr。- 如果這不可能,您可以
2>&1
在ddt
命令之後添加,將其標準錯誤重定向到標準輸出(並允許$( )
擷取它)。但這存在風險,如果ddt
列印任何實際錯誤,它會繼續嘗試export
這些消息,結果不可預測(並且可能是不希望的)。