“逃离”噩梦
我一直在试图把下列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
只要用引号将它贴上去,就像@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"
我更新了我的答案。我喜欢使用助手的想法,但将它们添加到.bashrc不是一种选择。我现在正在玩弄它,很确定这将是我的解决方案。感谢您的帮助 – TryTryAgain 2013-03-12 04:45:35
'.bashrc'只是一个建议,实际上只适用于全局取消'Program Files(x86)'的别名,因为您可能不得不在命令行中处理它。 – ocodo 2013-03-12 04:56:20
@TryTryAgain因为无论如何你都是在剧本中完成所有这些工作,所以你应该习惯于先设置变量,然后就可以更容易。请记住引用变量用法'“$ {varname}”'而不是'$ varname',以便扩展为具有空格的表达式的变量不会被解释为多个变量。 – ocodo 2013-03-12 05:01:53
在你的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)
+1为“不应该也不能逃脱两次” – ocodo 2013-03-12 02:38:09
转义两次是我绕过错误“scp:ambiguous target”的叠加方式,我从很多指向转义空格和使用scp包括接受的答案的站点读取它所以。是什么让你说我“不能”@Slomojo。也许不是最佳实践,但它的工作原理? – TryTryAgain 2013-03-12 04:48:59
好的,所以你“可以”,但你不应该这样做,你只是在未来尝试以这种方式解决问题时,为自己创造问题。 - 当我说引号中的“can”时,你不会转义两次,你是在转义'\\',以便它成为一个字面的'\',然后在后续的常规转义中使用它处理,这一点是错综复杂的,这就是为什么你应该避免它。保持简单, – ocodo 2013-03-12 04:54:13
你为什么不引用它? – ocodo 2013-03-12 02:07:54
我一直在寻找梦魇,但发现这一点,但它是人们很多困惑的话题 - 阅读此内容的每个人都应该坚持Slomojo的建议,以避免试图超越转义字符串并将其转化为变量尽快! (在你点击之前)当你有一个完美的勺子时,你不会把手伸进搅拌机吗? – osirisgothra 2015-06-13 11:26:26