web-dev-qa-db-fra.com

Comment va-t-on échapper à la "" (accent grave / backtick) sur un chemin?

J'ai tendance à préfixer OFT-UTILISÉ fichiers et dossiers avec le caractère "accent grave" (tilde non-déplaçant, la tickette arrière ou un accent simple, Whathaveyou ..), comme il est facile. Pour en avoir, et laissez-moi trier les choses par ordre alphabétique, tout en laissant moi choisir de montrer quelques articles sur le dessus. Il fonctionne bien, sauf lorsque je vais accéder à ces fichiers via CLI ou SSH/SCP.

Si j'essaie d'exécuter une commande, appelez le fichier non évalué ↝ Cela me frappe dans une session interactive. Par exemple

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

Pourtant, si j'essaie la solution logique ↯

# 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

Je sais que la "nouvelle" règle consiste à utiliser une syntaxe comme export NOW=$(date) vs export NOW= `Date` (en fait, j'ai eu un ours d'une heure écrire ce dernier en syntaxe SE MD ...) Mais cela n'est pas liée au ENV ou de script ...

Remarque: Ceci est Un environnement Mac OS X, mais cela dit, l'interface graphique n'a jamais eu de problème avec ce personnage au jour le jour Base, et généralement, s'il y aura un problème de syntaxe dans le terminal, Apple= fait un très bon travail de désactivation du comportement dans l'interface graphique ... Je ne sais pas si ceci est un bug, Ou si la technique de traiter avec de tels chemins est simplement obscure .. mais jusqu'à présent, J'ai été incontestable de trouver un moyen "de l'échapper"?

13
mralexgray

Vous pouvez utiliser 3 backslashes comme mentionné par JED Daniels ou vous pouvez l'envelopper en guillemets simples (') et utiliser une seule barre oblique inverse.

Exemple de deux sont ci-dessous.

$ 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     
$
10
Rik Schneider

Trois backslashes devraient le faire:

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

La première barre oblique inverse échappe à la backtock afin qu'il soit envoyée de l'autre côté, mais l'autre côté jette l'erreur car elle s'attend à ce que les backtscks soient en paires. La deuxième barre oblique inverse échappe au premier back-backslash, alors vous avez besoin des deux backslash supplémentaires afin que vous puissiez envoyer une barre oblique inverse de l'autre côté.

EDIT: AS RIK MENTIONS, vous pouvez également le faire avec une citation unique. Je n'avais pas pensé à cela parce que vous ne pouvez pas l'allonger avec des variables (elles ne seront pas étendues sur le système local lorsque dans les devis simples).

5
Jed Daniels

Normalement, les lignes de commande sont interprétées par la coquille une fois. Toutefois, pour des raisons historiques, SCP transmet également le nom du fichier à la coque distante, de sorte que le nom du fichier est interprété par des coquilles deux fois. C'est aussi ce qui fait des choses comme scp remote:'/path/prefix*' /path/local/ Travailler, la coque distante est en expansion /path/prefix*.

Le moyen le plus simple d'éviter la deuxième expansion est d'utiliser SFTP, qui n'utilise pas de coquille distante. Il reste toujours une expansion globale, mais puisque vous pouvez lui donner des commandes sur Stdin, vous pouvez éviter toute expansion de votre shell local.

Autre que cela, vous pouvez utiliser n'importe lequel des mécanismes de citation de shell normaux, y compris ceux donnés par @jed Daniels et @rik Schneider, mais je voulais expliquer ce qui se passe effectivement et mentionne SFTP.

(Vous pouvez utiliser toutes sortes de fonctionnalités Shell dans votre nom de fichier SCP, par exemple scp server:\$HOME/file dest utilisera l'idée de télécommande coquille de $HOME, tandis que si vous avez sorti le \, il utiliserait votre local shell.).

3
derobert