Problema no script com espaços no nome do arquivo

11

Eu tenho um script que scp é um arquivo do host remoto de volta ao local. Às vezes, os nomes dos arquivos contêm espaços. O scp não gosta de espaços em seus nomes de arquivo. Por alguma razão, minhas tentativas de manipular os espaços não resultaram no caminho scp correto.

Código:

PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg
scp $PATH Me@10.1.10.33:/Users/Me/Desktop

Resulta em

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

A inclusão de PATH entre aspas "$PATH"gera o mesmo erro.

Trocar os espaços por espaços vazios também não está funcionando, embora tanto quanto eu possa dizer:

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

embora imprimir o caminho de escape mostre que a edição funcionou:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
Miles Alden
fonte
4
Por favor, não use $PATHpara suas próprias variáveis, porque seu terminal precisa dele.
Bernhard

Respostas:

19

Você deve citar a declaração e o uso

path="/var/root/Documents/MyFile OG-v1.2.3.pkg"
scp "$path" Me@10.1.10.33:/Users/Me/Desktop

Se você não citar a primeira, $pathela conterá apenas a primeira parte. Se você não citar o segundo, scptratará cada parte separada por espaço como um argumento.

(Alterei $PATHpara $pathporque $PATHé uma variável reservada importante e você não deve usá-la para propósitos gerais.)

Matteo
fonte
1
Perfeito! Obrigado é um milhão de @ Matteo. Acontece que também havia um espaço prefixado jogando uma chave nele.
Miles Alden
1

Eu estava tentando algo muito semelhante ao ssh e passando uma linha de comando através dele. por exemplo

ssh <somehost> ls -l "$PATH"

Descobri que simplesmente definir "$ PATH" não funcionava - ainda gerava erros. No entanto, se eu corresse

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

Isso funcionou. O truque é garantir que um conjunto "" adicional seja passado para o comando ssh a partir do shell.

Roland Ward
fonte