2012-12-05 182 views
0
ssh -f [email protected]$machine_name "cd $path; shard_path=`find . -name \"shard0\"`; cd $shard_path; mkdir temp" 

的目錄結構是$ PATH/NODE0/shard0我的bash腳本有什麼問題?

在此腳本中,VAR shard_path是空的,爲什麼?目錄temp~/中構建,但不在shard0中構建。

+2

脫離主題,如何在遠程計算機上編寫bash腳本,並執行該腳本的ssh? – xiaoyi

回答

2

因爲您正在使用雙引號將命令發送到服務器,該服務器正在本地擴展。它試圖根據它們的本地值替換$path$shard_path,並且由於$shard_path沒有在本地定義,所以它擴展爲無。

您可以通過使用單引號將命令在服務器上執行來避免大量引用問題。您需要的確切引用取決於這些變量的確切位置。但是,從您的意見,這聽起來像這是你所需要的命令:

ssh -f [email protected]$machine_name "cd $path;"'shard_path=$(find . -name "shard0"); cd $shard_path; mkdir temp' 
+0

謝謝!但它不起作用。 – jseanj

+1

@SuJinJin在這裏幫我一下。什麼不行?你期望的結果是什麼,你看到了什麼?在客戶端或服務器端是否定義了'$ path'?你可以把'cd'命令改成'echo',看看$ shard_path正在擴展到什麼地方?另外,如果你知道目錄結構是'$ path/node0/shard0',你可以使用它來代替'find'嗎?例如''cd $ path/node0/shard0''。再說一遍,如果某些東西不能正常工作,請用'echo'替換它以查看變量擴展到的內容。 –

+0

'$ path'是在客戶端定義的,所以'echo $ path'將是目錄路徑,但'$ shard_path'是在服務器上定義的,'echo $ shard_path'或'echo \ $ shard_path'不會work.I不能用'find'來代替'find',因爲我不知道'node0'是什麼,也許是'node1',我只是想在正確的目錄中改變。 – jseanj

1

從布賴恩·坎貝爾的討論中,我假定$path變量是本地客戶機上和$shard_path是在遠程位置。

然後嘗試以下操作:

ssh -f [email protected] "echo $path; cd $path; shard_path=\$(find . -name \"shard0\"); echo \$shard_path;" 

注:如果有一種可能性,即有多個文件被稱爲「shard0」,找到會輸出很多路徑,所以你可能需要使用
shard_path_array=(\$(find . -name \"shard0\"));
這使得找到的輸出到一個數組,然後可以使用例如切換到一個路徑
cd \${shard_path_array[0]}(在遠程機器)

+0

它的工作,你的筆記是一種保險實踐,謝謝 – jseanj

+0

很高興能幫到你!既然它有效,你能接受答案嗎? cheerio – Pitt