1

以下をbashスクリプトに入れようとしています:

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

...コマンドライン経由で期待どおりに動作します。

スクリプトに配置しようとすると、明らかにスペースを二重にエスケープする必要があります。私が試した多数のバリエーションで成功することはできません。

私は思うでしょう:

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

...うまくいきますが、そうではありません。私が白髪になって禿げる前に何か提案はありますか?ありがとう

私が試したすべてのバリエーションでスペースを無駄にすることはありませんが、ほとんどすべてをエスケープしようとしたと言えます。「No such file or Directory」を受け取った場合、ファイルが実際に解決されるまで明らかにエスケープしますが、パス エラーが発生しない場合でも、コマンドは正常に完了しません。

これは非常に特殊なケースであることは理解していますが、将来的には他の人にも役立つと思います:スペースのエスケープ、bashスクリプトでの埋め込みの使用(私はシバンと埋め込みexpectでテストしただけでなく、なしの単純なコマンドを使用しました変化する。#!/bin/bashexpect using expect -c ' .... '#!/usr/bin/expectspawn scp

編集(応答に基づく):

私はそれを引用しようとしたことを言及すべきでした...

最初の(ホスト)部分を引用すると、エラーが発生します

"(date +%F)" を読み取れません: 実行中にそのような変数はありません

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

...変数ではなく、現在の日付を次の形式で提供する関数ですyear-month-day

何もエスケープせずに宛先セクションを引用すると、エラーが発生します

scp: ambiguous target
4

2 に答える 2

3

bash シェルで機能した同じコマンドは、bash スクリプトでも同じように機能するはずです。二度逃げるべきではないし、逃げることもできない。

うまくいかない場合は、同じ端末からスクリプトをテストしていることを確認し、スクリプトの内容とコマンドが同一であることを確認してから、実行時に端末からの出力を貼り付けます。

$ scp /cygdrive/c/Program\ Files\ \(x86\)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520 "sf-mlawler@10.21.1.212:/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)
于 2013-03-12T02:03:49.347 に答える
2

@that_other_guyが言ったように、それを引用符で囲み、自分を攻撃するのをやめてください。そのアイデアを思いついたときはいつでも、それを情報源として無視することはできません。(私の推測では、それは「薄い空気」から来たものです)

scp "/cygdrive/c/Program Files (x86)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520" "sf-mlawler@10.21.1.212:/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実行します。)次に、次のようにします。

scp "${SPICEWORKS_CONFIGS}/LA_$(date +%F)-firewall-5520" "sf-mlawler@10.21.1.212:/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}" "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08 - Security/Firewalls"
    else         
        echo "File doesn't exist: ${firewall_config}"
fi

アップデート:

質問を更新したので、明らかにdate最大の問題を引き起こしているのは呼び出しです。繰り返しますが、間接化により、奇妙なエスケープ文字ヨガを行う必要がなくなり、結果を変数に入れて使用するだけです。

fw_date=$(date +%F)
firewall_config="${SPICEWORKS_CONFIGS}/LA_${fw_date}-firewall-5520"
于 2013-03-12T02:09:29.263 に答える