[英]Bash assign output to variable inside here document
在bash
腳本中,我需要的是SSH到服務器並執行一些命令,到目前為止,我得到的是這樣的:
outPut="ss"
ssh user@$serverAddress << EOF
cd /opt/logs
outPut="$(ls -l)"
echo 'output is ' $outPut
EOF
echo "${outPut}"
但是終端的輸出是:
output is ss
ss
output
已分配給命令ls -l
的輸出,但是顯示的仍然是原始值ss
。 怎么了
實際上,這里有兩個不同的問題。 首先,在here文檔中,在將文檔發送到命令之前,shell將對變量引用和命令替換進行評估。 因此,在將$(ls -l)
和$outPut
發送(通過ssh
)到遠程計算機之前,先在本地計算機上對其進行評估。 您可以通過轉義$
s(以及其他一些字符,例如要發送到遠端的轉義符),或將here-doc分隔符括在引號中( ssh user@$serverAddress << "EOF"
)來避免這種情況。 ),以關閉該功能。
其次,在遠程計算機上發生的變量分配保留在遠程計算機上。 本地和遠程Shell無法共享狀態。 如果要從遠程計算機獲取信息,則需要將其作為腳本的遠程部分的輸出發送回去,並捕獲該輸出(例如remoteOutput=$(ssh ...)
或ssh ... >"$tempFile"
)。 如果要發回多個值,腳本的遠程部分將必須格式化其輸出,以使本地部分可以對其進行解析。 另外,請注意,來自遠程部分的任何其他輸出(包括錯誤消息)都將混入其中,因此您必須仔細解析以獲取所需的值。
不,對不起,該方法不起作用。
在here-doc中使用命令替換值(以printf表示)(EOF之間的行):
ssh user@$serverAddress << EOF printf 'output is %s\\n' "$(ls -l /opt/logs)" EOF
或者,您可以從ssh內部捕獲命令的執行,然后使用該值。
outPut="$( ssh user@$serverAddress << EOF cd /opt/logs ls -l EOF )" echo 'output is ' "$outPut" echo "${outPut}"
選項1看起來更干凈。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.