web-dev-qa-db-ja.com

ファイル名にスペースが含まれるスクリプトの問題

Scpがリモートホストからローカルにファイルを戻すスクリプトがあります。ファイル名にスペースが含まれている場合があります。 scpは、ファイル名にスペースが含まれていないことを好みません。何らかの理由で、スペースを処理する私の試みは正しいscpパスをもたらしませんでした。

コード:

PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg
scp $PATH [email protected]:/Users/Me/Desktop

結果

Cannot find directory: var/root/Documents/MyFile
Cannot find directory: OG-v1.2.3.pkg

PATHを引用符で囲んでください"$PATH"でも同じエラーが発生します。

エスケープされたスペースとスペースの交換も機能しませんが、私が知る限り、次のようにする必要があります。

ESC_PATH=${PATH/' '/'\ '}

エスケープされたパスを印刷すると、編集が機能したことが示されます。

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
11
Miles Alden

宣言と使用法の両方を引用する必要があります

path="/var/root/Documents/MyFile OG-v1.2.3.pkg"
scp "$path" [email protected]:/Users/Me/Desktop

最初を引用しない場合、$pathには最初の部分のみが含まれます。 2番目を引用符で囲まない場合、scpはスペースで区切られた各部分を引数として扱います。

(私は変わった $PATHから$path理由は$PATHは重要な予約変数であり、一般的な目的で使用しないでください。)

19
Matteo

私はsshで非常によく似たものを試し、コマンドラインを通過させていました。例えば.

ssh <somehost> ls -l "$PATH"

「$ PATH」を定義するだけではうまくいかないことがわかりました。それでもエラーが発生しました。でも走ったら

ssh <somehost> ls -l "\"$PATH"\"

これはうまくいきました。トリックは、追加の「」がシェルからsshコマンドに渡されるようにすることです。

1
Roland Ward