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 ENV
script 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" ?
Respostas:
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.
fonte
Três barras invertidas devem fazer isso:
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).
fonte
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 .).fonte