Como alguém escapa do "` "(sotaque grave / backtick) em um caminho?

12

Costumo prefixar os arquivos e pastas mais usados com o caractere "acentuação grave" (til sem mudança de turno, back-tick ou sotaque simples, o que você deve ..), pois é fácil encontrá-la, e permita-me classifique as coisas em ordem alfabética, enquanto me permite optar por mostrar alguns itens na parte superior. Ele funciona muito bem, exceto quando eu ir para aceder a estes ficheiros através do CLI ou SSH / SCP.

Se eu tentar executar um comando, chamar o arquivo sem escape (ele me levará a uma sessão interativa .. por exemplo)

# scp -r dns.local:/`Downloads/CrazyRussianCars/ ~/
↩
>

No entanto, se eu tentar a solução lógica ↯

# scp -r dns.local:/\`Downloads/CrazyRussianCars/ ~/
↩
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

Eu sei que a regra "nova" é usar uma sintaxe como export NOW=$(date)vs export NOW= `date` (na verdade, eu tive tempo de escrever essa última na sintaxe SE MD ...), mas isso não tem relação com o ENVscript ou com qualquer outro. ..

Nota: Este é um ambiente Mac OS X, mas, dito isso, a GUI nunca teve um problema ao lidar com esse personagem diariamente, e geralmente, se houver um problema de sintaxe no Terminal, Apple faz um bom trabalho em desabilitar o comportamento na GUI ... Não tenho certeza se isso é um bug ou se a técnica para lidar com esses caminhos é simplesmente obscura .. mas, até agora, não consegui encontrar um maneira "de escapar" ?

mralexgray
fonte
por que não usar apenas um personagem que não precisa ser escapado como o número 1?
JamesRyan
o backtick é - visualmente - menos perturbador (para mim) e possui menos bagagem semântica inerente ao redistribuí-lo como um delimitador de classificação.
Mralexgray

Respostas:

10

Você pode usar três barras invertidas, como mencionado por Jed Daniels, ou envolvê-las em aspas simples (')e usar uma única barra invertida.

Exemplo de ambos estão abaixo.

$ touch dir/'`rik' 
$ ls -l dir
total 1865376
-rw-r--r--  1 rik  staff          0 Jul  1 09:51 `rik 
$ scp localhost:dir/\\\`rik ./ `rik         
100%    0     0.0KB/s   00:00     
$ scp localhost:dir/'\`rik' ./ `rik     
100%    0     0.0KB/s   00:00     
$
Rik Schneider
fonte
impressionante. Acho que vou escolher essa resposta porque é bom ter duas maneiras de fazer isso. de qualquer maneira, você também pode usar essa técnica localmente, usando apenas uma barra, ou para a barra avesso, NO SLASHES e simplesmente a técnica de aspas simples ao redor do arquivo ou diretório problemático .. obrigado!
Mralexgray
5

Três barras invertidas devem fazer isso:

jed@jed-osx:~$ ls -la \`foo
ls: `foo: No such file or directory
jed@jed-osx:~$ scp desk:\\\`foo .
`foo                                            100%    0     0.0KB/s   00:00    
jed@jed-osx:~$ ls -la \`foo
-rw-r--r--  1 jed  staff  0 Jul  1 09:45 `foo
jed@jed-osx:~$ rm \`foo

A primeira barra invertida escapa do backtick e é enviada para o outro lado, mas o outro lado gera o erro porque espera que os backticks estejam em pares. A segunda barra invertida escapa à primeira barra invertida, então você precisa de duas barras invertidas extras para enviar uma barra invertida escapada para o outro lado.

EDIT: Como Rik menciona, você também pode fazê-lo com uma única citação. Eu não tinha pensado nisso porque você não pode usar variáveis ​​(elas não serão expandidas no sistema local quando estiver entre aspas simples).

Jed Daniels
fonte
3

Normalmente, as linhas de comando são interpretadas pelo shell uma vez. No entanto, por razões históricas, o scp também passa o nome do arquivo para o shell remoto, para que o nome do arquivo seja interpretado por shells duas vezes . É também isso que faz as coisas scp remote:'/path/prefix*' /path/local/funcionarem, o shell remoto está se expandindo /path/prefix*.

A maneira mais fácil de evitar a segunda expansão é usar o sftp, que não usa um shell remoto. Ele ainda faz a expansão glob, mas como você pode dar comandos no stdin, pode evitar completamente a expansão do shell local.

Fora isso, você pode usar qualquer um dos mecanismos normais de citação de shell, incluindo os fornecidos por @Jed Daniels e @Rik Schneider, mas eu queria explicar o que realmente está acontecendo e mencionar o sftp.

(Você pode usar todos os tipos de recursos do shell no seu nome de arquivo scp, por exemplo scp server:\$HOME/file dest, usará a idéia do shell remoto$HOME , enquanto que, se você o tiver retirado \, ele usará o shell local .).

derobert
fonte