[英]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.