2017-08-07 23 views
1

私は2つのexpectコマンドを持っていますが、私はその展開について理解していません。このコマンドで(文脈では、私が指定したディレクトリ内のすべてのログファイルのダウンロードや、ブランク、サーバーに接続するスクリプトを持っている。)Bashはアスタリスク*のエスケープを期待していますか?

expect -c " 
    set timeout 1 
    spawn scp [email protected]:/logdir/\*.log . 
    expect yes/no { send yes\n ; exp_continue } 
    expect password: { send $pass\n } 
    expect 100% 
    sleep 1 
    exit 
"; 

、ということを意味し、どのspawn scp [email protected]:/logdir/*.log .として生み出されたコマンドが表示さを期待する\取り除かれた。このコマンドで

expect -c " 
    set timeout 1 
    spawn ssh [email protected] {echo '' | tee /logdir/\*.log > /dev/null} 
    expect yes/no { send yes\n ; exp_continue } 
    expect password: { send $pass\n } 
    expect eof 
"; 

は、\があったことを意味し spawn ssh [email protected] echo '' | tee /logdir/\*.log > /dev/nullとして生成されたコマンドが 削除されませんディスプレイを期待しています。なぜ違うのですか? ( tee /logdir/*.logのようにアスタリスクをエスケープしないとうまくいきますが、上記の場合とは何か違うことは分かりません)

+0

回答があなたの問題を解決するのに役立ちましたか? – pynexj

+0

おっと、私は今までこの質問を忘れていました。うん、それは私の問題、おかげで私を助けた! – Eric

答えて

3

これはTclがバックスラッシュを処理する方法です。 Tcl docによると

[bash] # tclsh 
% puts \* 
* 
% puts "\*" 
* 
% puts {\*} 
\* 
% 

バックスラッシュ(\)は、その後、バックスラッシュ置換が発生した単語の中に表示された場合。 以下で説明するすべてのケースでは、バックスラッシュが削除され、次の文字は通常の文字として扱われ、その単語に含まれます。次の表は、特別に処理されるバックスラッシュシーケンスと、各シーケンスを置き換える値を示しています。

[...]上記のように

はバックスラッシュ置換をバックスラッシュ、改行を除いて、中括弧で囲まれた単語の上で実行されていません。

+0

scp(およびsftp rcp rsync)の_remote_ファイルのglobは、ローカルシェルで処理する必要はなく、通常は処理できません。リモートシステム上でピアプロセスによって処理されます。 –

+0

はい、あなたは正しいです。私の答えをロールバックして部品を取り外しました。 – pynexj

関連する問題