2013-03-12 136 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