2013-03-12 137 views
1

我一直在試圖把下列bash腳本:「逃離」噩夢

scp /cygdrive/c/Program\ Files\ \(x86\)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520 "[email protected]:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08\ -\ Security/Firewalls" 

...通過命令行預期其工作。

當我嘗試將它放在一個腳本中時,我顯然將不得不雙重逃離空間,其他任何東西?我無法與我嘗試過的衆多變體取得成功。

我會想:

scp /cygdrive/c/Program\\ Files\\ \(x86\)/Spiceworks/data/configurations/LA_\$(date\ +%F)-firewall-5520 "[email protected]:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08\\ \\-\\ Security/Firewalls" 

...會的工作,但事實並非如此。任何建議,在我灰色和禿頂之前?謝謝

我不會浪費空間與我試過的所有變化,但我會說我已經試過逃脫幾乎所有東西,基本上沒有和許多之間沒有成功。當我收到「沒有這樣的文件或目錄」時,我顯然會逃避,直到文件真正解決,但即使沒有出現路徑錯誤,該命令也沒有成功完成。

我明白這是一個相當具體情況,但我想它會幫助別人的未來:逃避的空間,在bash腳本,使用嵌入式expect(我有一個#!/bin/bash家當測試,嵌入式expect using expect -c ' .... '以及爲#!/usr/bin/expect使用簡單spawn scp命令沒有變化

EDIT(基於響應):

我應該提到我曾嘗試引用它...

引用第(主機)部分對我錯誤

無法讀取 「(日期+%F)」:沒有這樣的變量 在執行

"spawn scp "/cygdrive/c/Program Files (x86)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520" "[email protected]:/home/sf-mlawler/SBOX_..." 

...這不是一個變量,它是一個功能給我在格式year-month-day

引述目標部分,而沒有任何逃避當前的日期給我的錯誤

scp: ambiguous target 
+1

你爲什麼不引用它? – ocodo 2013-03-12 02:07:54

+0

我一直在尋找夢魘,但發現這一點,但它是人們很多困惑的話題 - 閱讀此內容的每個人都應該堅持Slomojo的建議,以避免試圖超越轉義字符串並將其轉化爲變量儘快! (在你點擊之前)當你有一個完美的勺子時,你不會把手伸進攪拌機嗎? – osirisgothra 2015-06-13 11:26:26

回答

2

只要用引號將它貼上去,就像@that_other_guy所說的那樣,你不能,也不應該試着逃跑兩次,無論你有什麼想法,都不要把它當作信息來源。(我的猜測是它「空氣稀薄」 來到

scp "/cygdrive/c/Program Files (x86)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520" "[email protected]:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08 - Security/Firewalls" 

你甚至可以給自己一些助手:

export PROGFILESx86="/cygdrive/c/Program Files (x86)" 
export SPICEWORKS_CONFIGS="${PROGFILESx86}/Spiceworks/data/configurations" 

(它們添加到.bashrc,exec的吧。)然後執行:

scp "${SPICEWORKS_CONFIGS}/LA_$(date +%F)-firewall-5520" "[email protected]:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08 - Security/Firewalls" 

我也關注了你試圖scp文件實際存在,包起來的狀態,以驗證他們的存在,它只有在自動生成文件名時纔有意義。

firewall_config="${SPICEWORKS_CONFIGS}/LA_$(date +%F)-firewall-5520" 

if [ -e "${firewall_config}" ] 
    then 
     scp "${firewall_config}" "[email protected]:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08 - Security/Firewalls" 
    else   
     echo "File doesn't exist: ${firewall_config}" 
fi 

更新:

既然你已經更新了你的問題,這是很明顯的date呼叫傳給你的最大的問題,再一次,間接節省了你做奇怪的轉義字符瑜伽,剛剛得到的結果變成一個var並使用它。

fw_date=$(date +%F) 
firewall_config="${SPICEWORKS_CONFIGS}/LA_${fw_date}-firewall-5520" 
+0

我更新了我的答案。我喜歡使用助手的想法,但將它們添加到.bashrc不是一種選擇。我現在正在玩弄它,很確定這將是我的解決方案。感謝您的幫助 – TryTryAgain 2013-03-12 04:45:35

+0

'.bashrc'只是一個建議,實際上只適用於全局取消'Program Files(x86)'的別名,因爲您可能不得不在命令行中處理它。 – ocodo 2013-03-12 04:56:20

+1

@TryTryAgain因爲無論如何你都是在劇本中完成所有這些工作,所以你應該習慣於先設置變量,然後就可以更容易。請記住引用變量用法'「$ {varname}」'而不是'$ varname',以便擴展爲具有空格的表達式的變量不會被解釋爲多個變量。 – ocodo 2013-03-12 05:01:53

3

在你的bash shell中工作的命令應該和你的bash腳本一樣。你不應該也不能逃避兩次。

如果它不工作,確保你在同一終端測試腳本,確保腳本內容,你的命令是相同的,然後將其粘貼輸出終端,當你做:

$ scp /cygdrive/c/Program\ Files\ \(x86\)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520 "[email protected]:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08\ -\ Security/Firewalls" 
(successful scp output here) 
$ cat testscript 
(testscript contents here, should be identical to above scp command) 
$ bash testscript 
(unsuccessful script/scp output here) 
+0

+1爲「不應該也不能逃脫兩次」 – ocodo 2013-03-12 02:38:09

+0

轉義兩次是我繞過錯誤「scp:ambiguous target」的疊加方式,我從很多指向轉義空格和使用scp包括接受的答案的站點讀取它所以。是什麼讓你說我「不能」@Slomojo。也許不是最佳實踐,但它的工作原理? – TryTryAgain 2013-03-12 04:48:59

+1

好的,所以你「可以」,但你不應該這樣做,你只是在未來嘗試以這種方式解決問題時,爲自己創造問題。 - 當我說引號中的「can」時,你不會轉義兩次,你是在轉義'\\',以便它成爲一個字面的'\',然後在後續的常規轉義中使用它處理,這一點是錯綜複雜的,這就是爲什麼你應該避免它。保持簡單, – ocodo 2013-03-12 04:54:13