bashのexpectでscpを行う際にファイル名がスペース区切りだと別ファイル扱いされます。

```

    fromfile='test@testserver.co.jp:/tmp/hoge¥ hoge¥ hoge.txt'
    expect -c "
    set timeout 3600
    spawn env LANG=C /usr/bin/scp ${fromfile} ${encdir}${ori_file}
    expect \"password:\"
    send \"${PW}\n\"
    expect \"$\"
    exit 0
    "
    
```

これは(や)、[や]も同様です。一度エスケープする必要がありますが、上のようにエスケープしておいても別ファイル扱いをしてエラーになります。

どのように対処すればいいかご存知の方はご教示お願いします。
CC BY-SA 3.0
2016-11-04T09:18:32.917
30095
2017-03-14T09:50:25.257
2016-11-05T10:10:22.557
2521
8593
question
bash expect
bashのexpectでscpを行う際にファイル名にスペースが入っていると別ファイル扱いされる
代わりにスペース、ファイルのリストを指定するには、`{file1,file2...}`を使用することができます:

```

    fromfile='test@testserver.co.jp:\{/tmp/hoge¥,/tmp/hoge.txt,hoge¥,hoge.txt\}'
    
```

[このリンク](https://stackoverflow.com/a/21691584/2614364)と[このリンク](http://www.hypexr.org/linux_scp_help.php)からは、複数のファイルをコピーするために：

```

    $ scp your_username@remotehost.edu:/some/remote/directory/\{a,b,c\} .
    $ scp your_username@remotehost.edu:~/\{foo.txt,bar.txt\} .
    
```
CC BY-SA 3.0
2016-11-05T03:38:13.203
30113
2016-11-05T03:38:13.203
2017-05-23T12:38:55.250
-1
17321
30095
answer
コメントの

> シェルコマンドでscp test@testserver.co.jp:'hoge hoge.txt' test.txt としても、hoge  
>  とhogeで分割されてしまいます。

が正しいのであれば、

```

    export FROMFILE='test@example.co.jp:"/tmp/hoge hoge hoge.txt"'
    export ENCDIR='...'
    export ORI_FILE='...'
    export PW='...'
    expect -c '
      set timeout 3600
      spawn env LANG=C /usr/bin/scp "$env(FROMFILE)" "$env(ENCDIR)$env(ORI_FILE)"
      expect "\[Pp\]assword:"
      send -- "$env(PW)\n"
      expect "$"
      exit 0
    '
    
```

かな？ <https://stackoverflow.com/questions/19858176/how-to-escape-spaces-in-
path-during-scp-copy-in-linux> にあるように、2重にエスケープ or クォートしないとダメっぽいです。

各種変数を、bash の変数として expect スクリプトに埋め込むのではなく、環境変数として渡さないとクォート処理が難しいと思われます。

_2017-03-14 追記:_
定期的に「誰か評価して」と（晒し）あげられてたので、恥ずかしくないようにちゃんとクォート処理に対する考慮を追加しました。パスワードの先頭が `-`
である場合への考慮も追加しました。
CC BY-SA 3.0
2016-11-05T07:35:40.320
30114
2017-03-14T09:50:25.257
2017-05-23T12:38:55.307
-1
2521
30095
answer