簡體   English   中英

在bash腳本中將SSH輸出捕獲為變量

[英]Capturing SSH output as variable in bash script

在編寫bash腳本時,我一直在努力解決這個問題。 基本上,我想測量遠程服務器上程序的時間,所以我使用命令: /usr/bin/time -f %e sh -c "my command > /dev/null 2>&1"來執行程序。 但是,似乎我無法將命令(SSH)的輸出捕獲到變量。 實際上,結果(時間)一直打印到stdout。

完整的代碼是:

respond=$(ssh ${fromNode} /usr/bin/time "-f" "%e" "'sh' '-c' 'virsh migrate --live ${VM} qemu+ssh://${toNode}/system --verbose > /dev/null 2>&1'")

響應的值只是空的,盡管時間打印到標准輸出。

“time”命令將結果打印到stderr,而不是stdout。 因此,它不會通過管道傳輸到您的變量中。

您應該將stderr重新路由到stdout以實現您想要的:

 result=$(ssh host time "command" 2>&1)

您的完整代碼可能如下所示:

 respond=$(ssh ${fromNode} /usr/bin/time "-f" "%e" "'sh' '-c' 'virsh migrate --live ${VM} qemu+ssh://${toNode}/system > /dev/null 2>&1'" 2>&1)

嘗試交換重定向的順序(到2>&1 >/dev/null )。 你當前的代碼是將stdout和stderr發送到/ dev / null(所以我很好奇為什么要打印任何東西 )。

為什么這有必要? 語法2>&1表示'復制stdout(描述符1)為stderr(描述符2)'; 實際上,stderr被制作成當前標准輸出的副本。 如果先放入>/dev/null ,則首先將stdout重定向到/ dev / null,然后將stderr指向當前的stdout,即/ dev / null。

但是如果你把>/dev/null秒,stderr將首先成為當前stdout(正常輸出流)的副本,然后重定向stdout。 所以命令的stderr打印到tty(或解釋器)就好像它來自stdout,而stdout被靜音了。 這是你想要的行為。

來自man bash

請注意,重定向的順序非常重要。 例如,命令

 ls > dirlist 2>&1 

在命令時將標准輸出和標准錯誤都指向文件dirlist

 ls 2>&1 > dirlist 

僅將標准輸出指向文件dirlist,因為在將標准輸出重定向到dirlist之前,標准錯誤被復制為標准輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM