2017-11-25 55 views
0

我試圖在幾臺遠程主機上並行運行多組命令。 我已經創建了構建這些命令,然後在本地文件沿線的寫入輸出,事情的腳本:向遠程主機發出bash命令 - 寫入本地輸出文件時出錯

ssh <me>@<ip1> "command" 2> ./path/to/file/newFile1.txt & ssh <me>@<ip2> 
"command" 2> ./path/to/file/newFile2.txt & ssh <me>@<ip2> "command" 2> 
./path/to/file/newFile3.txt; ...(same repeats itself, with new commands and new 
file names)... 

我的問題是,我的腳本運行這些命令時,我得到出現以下錯誤:

bash: ./path/to/file/newFile1.txt: No such file or directory 
bash: ./path/to/file/newFile2.txt: No such file or directory 
bash: ./path/to/file/newFile3.txt: No such file or directory 
... 

這些文件不存在但將被寫入。話雖如此,目錄路徑是有效的。

奇怪的是,如果我複製並粘貼整個大命令,那麼它的工作原理沒有任何問題。我寧願讓它自動化;)。

任何想法?

編輯 - 詳細信息:

我的文件系統是以下幾點:

- home 
    - User 
    - Desktop 
     - Servers 
     - Outputs 
      - ... 

我從家裏/用戶/桌面運行bash腳本/服務器。 該腳本創建需要在遠程服務器上運行的命令。首先,腳本創建文件將被存儲的目錄。

outputFolder="./Outputs" 
... 
mkdir -p ${outputFolder}/f{fileNumb} 
... 

腳本然後繼續創建將遙控器上的主機被稱爲命令,並且它們各自的輸出將被放置在所創建的目錄中。 目錄在那裏。運行這些命令會給我帶來錯誤,但是打印然後將這些命令複製到同一位置會出於某種原因。我也試圖給出目錄的完整路徑,仍然是同樣的問題。

希望我已經更清楚了一點。

+1

必須存在重定向才能工作的路徑(中間目錄不是自動創建的)。所以'mkdir -p path/to/file'在重定向'> path/to/file/newFile.txt'之前。 –

+0

您的問題似乎並未包含足夠的相關信息以允許投機以外的任何內容。請提出問題的[最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve),以便所有相關信息(以及最小不相關信息)都在這裏。 –

+0

你的問題*仍然*沒有包含足夠的信息來真實地告訴發生了什麼 - 這就是創建一個MCVE的要點。但是你提到的「創建命令」讓我感到懷疑 - 你是否試圖在執行它們之前將命令存儲在變量中?如果是這樣,有很多事情可能會出錯。參見[BashFAQ#50:我試圖把一個命令放在一個變量中,但複雜的情況總是失敗!](http://mywiki.wooledge.org/BashFAQ/050)。 –

回答

1

如果這是你得到確切的錯誤消息:

bash: ./path/to/file/newFile1.txt: No such file or directory 

然後你會注意到,有冒號和點之間的額外的空間,所以它實際上是試圖打開一個名爲" ./path/to/file/newFile1.txt"文件(不引號)。

但是,要實現這個目標,你需要在重定向使用引號將文件名,如

something ... 2> " ./path/to/file/newFile1.txt" 

還是第一個字符必須比常規的空間別的東西。一個非破壞性的空間也許可能是某些編輯可能創建的,如果你碰到了alt-space或其他類似的東西。

+0

是個好主意,但我再次檢查過,並且有一個空間。 – dtam

1

我不相信你已經證明足以正確回答這個問題。

這看起來不像ssh的問題,而是你調用(ssh)命令的方式。

你說你正在將這些命令寫入一個文件中......假設你正在將該文件作爲腳本運行。你可以展示你用來做這件事的代碼嗎?我相信那是你的問題。

我懷疑你對運行腳本時工作目錄的改變方式做出了錯誤的假設。它沒有。你正在列出相對路徑,所以瞭解它們相對於什麼是重要的。這是複製和粘貼時最有可能工作的原因......您正在從不同的工作目錄執行。

+0

當我複製並粘貼它時,我在與正在運行的腳本相同的位置執行此操作。如果有幫助,我已經編輯了一些更多信息的原始文章。 – dtam

0

我是新來的bash腳本,並基於我見過的另一個建立我的腳本。我簡單地調用存儲已命令變量「運行」命令:

$cmd 

解決使用:

eval $cmd 

代替。我的不好,應該從一開始就給出完整的腳本。